ConcurrentHashMap实现原理
2017-11-07 本文已影响0人
哼哈二将0
我们知道HashTable:synchronize是针对整张Hash表的,就是每次锁住整张表让线程独占。
ConcurrentHashMap 允许多个操作并发进行,在于使用了锁分离技术,使用多个锁来控制对hash表的不同部分进行修改,
内部使用段来表示这些不同的部分,每个段就是一个小的HashTable,他们有自己的锁。
只要多个修改发生在不同的段上,他们就可以并发进行。
ConcurrentHashMap把整张表分成很多段,每一段就是一个小的HashTable(线程安全) ,他们有自己的锁,操作在不同段上可以并发进行。
锁分离:简单理解成把一个大的HashTable分解成多个,形成了锁分离。Hashtable的实现方式是---锁整个hash表
有些方法需要跨段:比如size() containsValue() ,则需要锁整个表而不仅仅是某个段,需要按顺序锁定所有的段,操作完以后,又按顺序释放所有的段。按顺序很重要,否则有可能出现死锁。ConcurrentHashMap 内部段数组final的,其他成员变量也是final的,需要保证段数组成员也是final,可以确保不会死锁,获得锁的顺序是固定的。