jdk1.8中的ConcurrentHashMap的putVal方法:
Node<K,V> f;
...
else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
//hash指向的索引无Node(键值对)时,使用CAS向其存入Node
if (casTabAt(tab, i, null,
new Node<K,V>(hash, key, value, null)))
break; // no lock when adding to empty bin
}
..
synchronized (f) {
//hash指向的索引有Node(键值对)时,使用synchronized锁住对应数组元素(即链表头)
比起jdk1.7对segment加锁, 1.8中锁的粒度更细