ConcurrentHashMap在JDK1.7中存在的问题:
在JDK1.7中以及解决了并发问题,可以支持N个Segment的并发,但是查询遍历链表时效率太低
在JDK1.8中底层数据结构调整如下:
这看起来是不是跟JDK1.8的HashMap数据结构一样?
其中抛弃了分段锁,采用了CAS+synchronized来保证并发安全
也将 1.7 中存放数据的 HashEntry 改为 Node,但作用都是相同的。其中val和next用了volatile 修饰,保证了
在内存中的可见性。
put方法:
根据key计算出hashcode,在定位到Node,如果当前Node为空表示可以写入数据,利用 CAS 尝试写入,失败则自旋保证成功。
判断是否需要扩容;
如果都不满足,使用synchronized锁写入数据;
判断是否需要转换成红黑树。
get方法:
根据计算出来的hashcode寻址,如果就在桶上就直接返回值;
如果是红黑树就按照红黑树的方式获取值;
如果不满足就按照链表的方式遍历获取值。