基本的Java集合类中, 线程安全的有Venctor和Hashtable,其余的ArrayList,LinkedList,HashMap,HashSet,TreeSet,LinkedHashSet,HashMap,TreeMap都不线程安全。可以由java.util.Collections来创建线程安全的集合,如:Connections.synchronizedSet(Set<T>);
Connections.synchronizedList(List<T>);Connections.synchronizedMap(Map<K,
V>)等,其简单的原理是每个方法都增加了synchronized来保证线程安全。效果和Venctor、Hashtable一样这样做显然不太好,比如锁定2个线程的读操作是没有意义的JDK1.5之后,提供了java.util.concurrent并发包,它提供的新集合类允许通过在语义中的少量更改来获得更高的并发。CopyOnWriteArrayList
其中的set、add、remove等方法,都使用了ReentrantLock的lock()来加锁,unlock()来解锁。当增加元素的时候使用Arrays.copyOf()来拷贝副本,在副本上增加元素,然后改变原引用指向副本。CopyOnWriteArraySet
使用了CopyOnWriteArrayList来存储数据,remove方法调用CopyOnWriteArrayList的remove方法。add方法调用了CopyOnWriteArrayList的addIfAbsent方法,addIfAbsent同样使用了ReentrantLock的lock()来加锁,unlock()来解锁。
ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash
table,它们有自己的锁(由ReentrantLock来实现的)。只要多个修改操作发生在不同的段上,它们就可以并发进行。
搞懂JAVA集合类--线程安全问题(五)
最新推荐文章于 2024-07-25 19:22:32 发布
本文介绍了Java中线程安全的集合类,包括Vector、Hashtable及如何利用Collections工具类创建线程安全集合。同时深入探讨了JDK1.5引入的并发包中CopyOnWriteArrayList、CopyOnWriteArraySet和ConcurrentHashMap的设计理念与实现机制。
3269

被折叠的 条评论
为什么被折叠?



