文章目录
前言
咱们话接前文,今天继续C~Map的剖根问底,有人在后台私信cas等的问题,后边会有专门的文章来分享这些知识点,毕竟每篇文章都要有自己的主题。不在主题里边的分享起来可能没完没了,导致主次错乱。还是附上我们的上一节文章连接:金三银四之ConcurrentHashMap剖根问底栏目(一)。
1、ConcurrentHashMap的get方法
get方法因为是取值,熟悉多线程编程我们知道,大部分情况下读是不用加锁的,C-Map也没例外,get时并没有加锁,如果我们稍微多问个为什么,就会想到这个C~Map的get方法为什么没有从treenode节点获取数据,看我们下边的注释e.find方法其实就是关键。
public V get(Object key) {
Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;
//算出key的hash
int h = spread(key.hashCode());
//取出table,然后根据路由算法,取出存该key的node节点
if ((tab = table) != null && (n = tab.length) > 0 &&
(e = tabAt(tab, (n - 1) & h)) != null) {
//如果取出来的节点key的hash与当前key的hash相等,且值也相等
//那么就是我们要找的值了
if ((eh = e.hash) == h) {
if ((ek = e.key) == key || (ek != null && key.equals(ek)))
return e.val;
}
//
else if (eh < 0