1.ConcurrentHashMap的高效并发机制是通过以下三方面来保证的
通过锁分段技术保证并发环境下的写操;通过 HashEntry的不变性、Volatile变量的内存可见性和加锁重读机制保证高效、安全的读操作;通过不加锁和加锁两种方案控制跨段操作的的安全性。
2.ConcurrentHashMap是如何加锁的
ConcurrentHashMap,它通过在链表上加锁来实现同步的。则看出ConcurrentHashMap其实就多增加了锁的个数,效率效率就提高;而HashTable是通过在每个方法上加Synchronized来实现同步的,这样使得效率略低于ConcurrentHashMap的原因。
3.ConcurrentHashMap的put方法实现步骤
1、首先,判断key和value是否为null,其中一个为null,则抛出NullPointerException()。
注:ConcurrentHashMap的key和Value都不能为null
2、计算哈希值:spread(key.hashCode());
3、根据哈希值计算放在table中的位置
4、通过哈希值执行插入或替换操作
如果这个位置没有值,直接将键值对放进去,不需要加锁
如果要插入的位置是一个forwordingNode节点,表示正在扩容,那么当前线程帮 助扩容3.3 加锁。以下操作都需要加锁
如果要插入的节点在链表中,遍历链表中的所有节点,如果某一节点的key哈希值和key与参数相等,替换节点的value,记录被替换的值;如果遍历到了最后一个节点,还没找到key对应的节点,根据参数新建节点,插入链表尾部
如果要插入的节点在树中,则按照树的方式插入或替换节点。如果是替换操作,记录被替换的值
5、判断如果节点数量是大于8,就将链表转化成红黑树(binCount >= TREEIFY_THRESHOLD)
6、如果操作3中执行的是替换操作,返回被替换的value,然后程序结束
7、如果能执行到这一步,说明节点不是被替换的,是被插入的,所以要将map的元素数量加1