1)利用锁的分段,默认16个锁共同维护整个ConcurrentHashMap,使一个写线程不会持有整个ConcurrentHashMap的锁,降低了持有锁的频率,大大的提高了并发性。
2)volatile变量的使用,根据先行发生原则:对于同一个volatile变量,一个写操作会先行发生后面的读操作,例如每一次写操作完成后都会对volatile变量的count进行改写,每次读操作都会先行访问这个count,从而使每次读操作不用加锁的情况下能够得到正确的结果,实现了可见性,使得大多数读都可以在不需要加锁的情况下得到正确的值,因为ConcurrentHashMap的key和value不能为空,所以只有在读到为空的时候说明发生了错误,这个时候才需要加锁读取。
3)内部对象HashEntry的不变属性next,每次插入只能在头节点前面插入,在删除一个节点,只是创建了新的部分链表,如果同时有读线程在遍历链表,可以不用加锁且保证正确性,因为原表仍然存在。