线程安全主要有几个方面:
1、初始化数据;
2、put数据;
3、get数据;
4、扩容;
5、统计容器大小
1、数据结构上Node里面的value和next都是volatile,transient volatile Node<K,V>[] table,保证线程间数据的可见性;
2、读取某一个节点用的是U.getObjectVolatile(),保证数据最新;
3、减小了锁的颗粒度,对链表头进行加锁;
4、用到了ForwardingNode标识位,实现了get的线程安全;
5、对Node中的hash值,当开始扩容,复制MODED=-1;
6、大量的采用了CAS的方式进行数据的写操作;
7、统计容器大小的设计,baseCount的CAS写+分而治之桶计数+桶的扩容;