Java线程安全的集合

本文介绍了Java中Vector和HashTable的线程安全特性,以及它们被Collections包装类和java.util.concurrent包中的ConcurrentHashMap、CopyOnWriteArrayList等替代的过程,强调了不同线程安全集合的加锁策略和性能优化。
摘要由CSDN通过智能技术生成

一、Vector和HashTable

Vector和ArrayList类似,都是长度可变的数组,不同的是,Vector是线程安全的,它给几乎所有的public方法加上了synchronized关键字。由于加锁导致性能下降,在不需要并发访问某一对象时,强制性的同步机制会显得多余,Vector目前已被弃用。
同样地,HashTable和HashMap类似,但HashTable是线程安全的,它也是给几乎所有的public方法加上了synchronized关键字。HashTable和HashMap的另一个不同点是HashTable的K和V不允许为空。目前由于的性能原因,HashTable已被弃用。

二、Collections包装的方法

ArrayList和HashMap替代了Vector和HashTable,但由于它们是线程不安全性,所以Collections提供了相应的包装的方法将它们包装成线程安全类,如下所示:

List<E> synArrayList = Collections.synchronizedList(new ArrayList<E>());
Set<E> synHashSet = Collections.synchronizedSet(new HashSet<E>());
Map<K, V> synHashMap = Collections.synchronizedMap(new HashMap<E>());
...

Collections为每种集合都声明了线程安全的包装类,在原集合的基础上添加了锁对象,集合中的方法通过锁对象实现同步。

三、java.util.concurrent包中的集合

1、ConcurrentHashMap

ConcurrentHashMap和HashTable都是线程安全类,不同之处在于加锁粒度上。HashTable的加锁方法是给每个方法加上synchronized关键字,锁住的是这个Table对象,而ConcurrentHashMap是更加细粒度的加锁。
JDK1.8之前,ConcurrentHashMap是对Segment片段加锁,是Table的一部分,不同Segment之间的并发操作不会相互影响。JDK1.8之后,取消了Segment字段,ConcurrentHashMap直接在Table的元素上进行加锁,进一步减少了并发冲突的概率。

2、CopyOnWriteArrayList和CopyOnWriteArraySet

CopyOnWriteArrayList和CopyOnWriteArraySet是加了写锁的ArrayList和ArraySet,锁住的是整个对象,但读操作可以并发执行。

3、其他

ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue、ConcurrentLinkedDeque等都是线程安全的集合,但是其中并没有ConcurrentArrayList,因为不能开发出一个通用且可以规避ArrayList开发瓶颈的线程安全类,只能锁住整个List,这用Collections的包装类就可以办到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值