ConcurrentHashMap:线程安全的HashMap。
BlockingQueue(接口):阻塞队列
CopyOnWriteArrayList:线程安全的list,在读写少的情况下非常好用
ConcurrentLinkedQueue:高效的并发队列,使用链表实现的,是一个非阻塞队列,线程安全的LinkedList
ConcurrentSkipListMap:跳表的实现。这是一个 Map,使用跳表的数据结构进行快速查找。+
ConcurrentHashMap
HashMap不是线程安全的,实现线程安全的HashMap是ConcurrentHashMap。
其读写操作都有着很高的性能:在读的时候几乎不需要加锁,在写的时候只需要对所操作的段进行加锁,不影响用户对其他段的访问
CopyOnWriteArrayList
满足CopyOnWrite的,所有的操作是创建底层数组的新的副本来实现的,创建一个副本,在副本上进行操作,最后再将副本的数据替换原来的数据
也就是说:在计算机,如果你想要对一块内存进行修改时,我们不在原有内存块中进行写操作,而是将内存拷贝一份,在新的内存中进行写操作,写完之后呢,就将指向原来内存指针指向新的内存,原来的内存就可以被回收掉了
在读操作的时候不需要加锁,因为并不会改变数据
但是在写的操作时,需要加锁,保证了同步,避免多线程写的时候会copy()多个副本出来。
ConcurrentLinkedQueue
队列分为阻塞队列(BlockingQueue)和非阻塞队列,非阻塞队列的经典例子就是ConcurrentLinkedQueue。阻塞队列是由加锁实现的。ConcurrentLinkedQueue是通过CAS操作实现的。他是一个性能非常优越的。主要使用CAS非阻塞算法实现线程安全的。
适用于性能要求比较高。同时对队列中的多个线程同时进行的场景
BlockingQueue
ArrayBlockingQueue:有界队列的实现类,底层是数组,一旦创建大小就定下来了,读写操作都需要锁。队列满了,写操作会阻塞;队列空时,读操作会阻塞
LinkedBlockingQueue:底层是单向列表实现的阻塞队列,可以是有界也可以是无界的,为了防止容量迅速激增,一般创建的时候会确定其大小,要是没有确定的话,大小就是Math.MAX_VALUE
PriorityBlockingQueue:无界队列,可以按照优先级进行排序。默认情况下元素采用自然顺序进行排序,也可以通过自定义类实现 compareTo()
方法来指定元素排序规则,或者初始化时通过构造器参数 Comparator
来指定排序规则。
ConcurrentSkipMap
查找 18 的时候原来需要遍历 18 次,现在只需要 7 次即可。针对链表长度比较大的时候,构建索引查找效率的提升就会非常明显。
使用跳表实现 Map
和使用哈希算法实现 Map
的另外一个不同之处是:哈希并不会保存元素的顺序,而跳表内所有的元素都是排序的。因此在对跳表进行遍历时,你会得到一个有序的结果。所以,如果你的应用需要有序性,那么跳表就是你不二的选择。JDK 中实现这一数据结构的类是 ConcurrentSkipListMap。