Java线程服务的集合详解版权声明
原创1.早期线程安全收集。
让我们从早期的线程安全集合开始,它们是Vector和HashTable
1.Vector
Vector和ArrayList同样,是可变长度的数组。ArrayList不同的是,Vector是线程安全的,这几乎为所有public所有方法都已添加。synchronized关键词。由于锁定导致的性能下降,当不需要并发访问同一对象时,这种强制同步机制是多余的,所以现在Vector已被弃用
2.HashTable
HashTable和HashMap相似的,不同的是HashTable是线程安全的,它几乎提供了所有public所有方法都已添加。synchronized关键字,还有另一个区别。HashTable的K,V都不能是null,但HashMap是的,出于性能原因,它现在已被弃用。
二、Collections包装方法
Vector和HashTable在被弃用后,它们是ArrayList和HashMap相反,但它们不是线程安全的,所以。CollectionsTool类提供了相应的包装方法,以将它们包装到线程安全集合中。
List
Set
Map<K,V> synHashMap = Collections.synchronizedMap(new HashMap<K,V>());
...
Collections为每个集合声明一个线程安全包装类,将一个Lock对象添加到原始集合,并且该集合中的每个方法都由该Lock对象同步。
三、java.util.concurrent包中的集合
1.ConcurrentHashMap
ConcurrentHashMap和HashTable它们是线程安全的集合,它们的区别主要在于锁的粒度。HashTable锁定方法是添加每个方法。synchronized关键字,所以锁定的是整体Table对象。而ConcurrentHashMap是一种更细粒度的锁。
在JDK1.8之前,ConcurrentHashMap添加的是分段锁,即Segment锁,每个Segment含有整个table部分,以便不同段之间的并发操作不会相互影响。
JDK1.8这一点得到了进一步的改善,并被取消。Segment字段,直接在table锁定元素以锁定每一行,从而进一步降低并发冲突的可能性。
2.CopyOnWriteArrayList和CopyOnWriteArraySet
它们被写入锁定ArrayList和ArraySet,则锁定整个对象,但可以并发执行读取操作。
-
此外,还有ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue、ConcurrentLinkedDeque等等,为什么不呢?ConcurrentArrayList原因是设计仿制药是不可能的,是可以避免的。ArrayList并发瓶颈的线程安全集合类只能锁定整个list,这用Collections中的打包类
————————————————
版权声明:本文是CSDN博主《战略》的原文如下CC 4.0 BY-SA版权协议,转载请附上原始来源链接和本声明。
原始链接:https://blog.csdn.net/lixiaobuaa/article/details/79689338
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除