跟1.7相比,在1.8中做了优化。
1.8的put方法中,假如数组某个位置上有一个元素,再新增一个节点,那么锁住头节点,就只有一个线程能处理该链表。如下图(1.8)。在1.7中,因为元素是segment类型的,本身是lock,那么不管之前位置上有没有元素,都是锁住该位置,同一时刻只有一个线程处理。
就只考虑上面说的情况,不考虑其他红黑树的优化,我认为在1.8中还是分段锁的思想,并没有得到什么多大的优化。因为不管锁住的是数组的某个位置还是锁住头节点,同一时刻都只能一个线程操作对应的链表。请问我这样的理解是否正确?
1.7和1.8锁的范围明显不一样,1.7的锁的范围要比1.8的更大。
如果不好理解,你看一下1.7的存储结构图
既然课堂上分析了ConcurrentHashMap1.8的源码,为何不尝试自己去分析一下?学习能力才是最重要的!