HashTable 容器使用synchronized 来保证线程的安全,但是在线程竞争激烈的情况下HashTable的效率非常低下!原因就在于所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器中的一部分数据,那么当多线程访问容器里不同的数据段的数据时,线程间就不会存在锁竞争了,从而可以有效的提高并发访问的效率,这就是 ConcurrentHashMap锁使用的锁分段技术。首先将数据分成一段一段的,然后给每一段数据都配一把锁,当一个线程占用锁,访问其中一个段的数据时,其他段的数据也可以被其他线程访问。
ConcurrentHashMap 是由Segment数组和HashEntry数组组成的。Segment继承了ReentrantLock类,在ConcurrentHashMap中扮演锁的角色,HashEntry则用于存储键值对数据。
每一个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须先获得他对应的segment锁!
1. get方法不需要加锁,因为使用 UNSAFE.getObjectVolatile(segments, u) 方法可以直接获得最新的数据!
2. size方法不需要加锁,总共分为三次操作,第一次,把所有的segment count加起来,然后查看modCount的值来确定是否有修改,如果有修改,进行第二次操作,再加一次,如果还有修改,锁住整个map再加一次!
相关文章:
1. http://www.cnblogs.com/dolphin0520/p/3932905.html
2. http://www.iteye.com/topic/344876
3. http://caoyaojun1988-163-com.iteye.com/blog/1758289