java并发框架之容器
ConcurrentHashMap
ConcurrentHashMap比HashTable高效。HashTable的get方法和put使用同一把锁,使用的是synchronized同
步方法。这样导致在别的线程访问put方法时,访问get方法的线程也会阻塞。而ConcurrentHashMap的get方
法是不用加锁的。get是没有put那么大风险的,get只需保证读入的值是最新即可,定义成volatile的变量,能
够在线程之间保持可见性,能够被多线程同时读,并且保证不会读到过期的值,但是只能被单线程写(有一种
情况可以被多线程写,就是写入的值不依赖于原值),在get操作里只需要读不需要写共享变量count和value,
所以可以不用加锁。之所以不会读到过期的值,是因为根据Java内存模型的happen before原则,对volatile字
段的写入操作先于读操作,即使两个线程同时修改和获取volatile变量,get操作也能拿到最新的值,这是用
volatile替换锁的经典应用场景。
ConcurrentLinkedQueue(非阻塞式并发容器)
在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用
阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个
锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现