搞懂JAVA集合类--线程安全问题(六)

来源:互联网 发布:淘宝帐号可以注销吗 编辑:程序博客网 时间:2024/05/19 23:24

基本的Java集合类中, 线程安全的有Venctor和Hashtable,其余的ArrayList,LinkedList,HashMap,HashSet,TreeSet,LinkedHashSet,HashMap,TreeMap都不线程安全。

可以由java.util.Collections来创建线程安全的集合,如:Connections.synchronizedSet; Connections.synchronizedList,Connections.synchronizedMap等,其简单的原理是每个方法都增加了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来实现的)。只要多个修改操作发生在不同的段上,它们就可以并发进行。

0 0
原创粉丝点击