多线程与高并发(六)--容器
概述

Vector
- Vector存放单个元素,所有方法都是synchronized方法。
- 基本不用。
Hashtable
- Hashtable使用哈希表来存储键值对(不支持null键和null值)。
- 所有方法都是synchronized方法。
- 基本不用。
HashMap
- HashMap使用哈希表来存储键值对(支持null键和null值)。
- 线程不安全。
Collections.synchronizedMap
- 可以把HashMap变为加锁版本。
- 锁没有直接加在方法上,加在了方法里。
public int size() { synchronized (mutex) {return m.size();} } public boolean isEmpty() { synchronized (mutex) {return m.isEmpty();} } public boolean containsKey(Object key) { synchronized (mutex) {return m.containsKey(key);} } public boolean containsValue(Object value) { synchronized (mutex) {return m.containsValue(value);} } public V get(Object key) { synchronized (mutex) {return m.get(key);} } public V put(K key, V value) { synchronized (mutex) {return m.put(key, value);} } public V remove(Object key) { synchronized (mutex) {return m.remove(key);} } public void putAll(Map<? extends K, ? extends V> map) { synchronized (mutex) {m.putAll(map);} } public void clear() { synchronized (mutex) {m.clear();} }
ConcurrentHashMap
- 插入效率并不高,读效率非常高。(工程中选用时需要经过压测)
- 详解见https://crossoverjie.top/2018/07/23/java-senior/ConcurrentHashMap/
ConcurrentSkipListMap
- 遍历效率更高
- 线程安全的有序的哈希表,适用于高并发的场景。基于跳表实现,跳表(Skip List)是平衡树的一种替代的数据结构,和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。(参考https://blog.coderap.com/article/241)
CopyOnWriteList
- 写时复制
- 写时加锁,读不加锁。
- 添加元素时,复制原来的List,扩展出一个位置,将元素放到扩展出来的位置,然后将原引用指向新List。
BlockingQueue:阻塞队列
多线程友好的API
-
- offer
- 添加一个值,是否加入进去会给一个返回值
- poll
- 读值(不remove)
- peek
- 取值(remove)
- offer
- LinkedBlockingQueue(无界队列)
- put(阻塞方法)
- 如果满了,阻塞。
- take(阻塞方法)
- 如果没有值,阻塞。
- ArrayBlockingQueue(有界队列)
- 同上
- DelayQueue
- 按照在队列中的等待时间排序。
- 按时间进行任务调度。
- PriorityQueue
- 内部有排序。
- SynchronusQueue
- 容量为0.
- 不是用来存储数据的,是用来给其他线程传递数据的。
- 如果没有线程取数据,会一直阻塞。
- TransferQueue
- 可以用来装数据
- 提供了transfer API:使用transfer会阻塞,等待别的线程取走。

浙公网安备 33010602011771号