常见的并发容器

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值