参考文献:
ConcurrentHashMap源码分析(JDK8版本)
从ConcurrentHashMap的演进看Java多线程核心技术 由于该文来自个人博客所有备份了一份见: /Users/lww/教程/集合
探索 ConcurrentHashMap 高并发性的实现机制 由于该文来自个人博客所有备份了一份见: /Users/lww/教程/集合
对于put操作,如果Key对应的数组元素为null,则通过CAS操作将其设置为当前值。如果Key对应的数组元素(也即链表表头或者树的根元素)不为null,则对该元素使用synchronized关键字申请锁,然后进行操作。如果该put操作使得当前链表长度超过一定阈值,则将该链表转换为树,从而提高寻址效率。由于寻址效率提高了则不需要用分段锁来提高读写效率了,所有jdk8就去掉了分段锁。我猜只是在改版链表或者(红黑树)结构的时候才需要同步,这样这种情况下才需要考虑读操作同步即下面一段文档所说的事情。 对于读操作,由于entry[]被volatile关键字修饰,因此不用担心数组的可见性问题。同时每个元素是一个Node实例(Java 7中每个元素是一个HashEntry),它的Key值和hash值都由final修饰,不可变更,无须关心它们被修改后的可见性问题。而其Value及对下一个元素的引用由volatile修饰,可见性也有保障。