引言

ConcurrentHashMap中有大量的CAS操作,tabAt、casTabAt、setTabAt是用来实现CAS的方法。
在这只是简单的学习了解,不做深层次的学习,比如为啥用sun.misc.Unsafe,绕过JVM优化数组操作之类的。

tabAt

获取数组tab中索引为i的节点。

1
2
3
4
static final <K,V> Node<K,V> tabAt(Node<K,V>[] tab, int i) {
//native 方法 获取当前节点
return (Node<K,V>)U.getObjectVolatile(tab, ((long)i << ASHIFT) + ABASE);
}

casTabAt

用CAS方法设置数组tab中索引为i的节点的值,如果当前节点与期望的节点c相同,则更新为节点v。

1
2
3
4
5
static final <K,V> boolean casTabAt(Node<K,V>[] tab, int i,
Node<K,V> c, Node<K,V> v) {
//native 方法 cas 获取tab数组中索引为i的节点,如果是和c相同,则更新为节点v
return U.compareAndSwapObject(tab, ((long)i << ASHIFT) + ABASE, c, v);
}

setTabAt

更新 数组tab中索引为i的节点 为 节点v。

1
2
3
4
static final <K,V> void setTabAt(Node<K,V>[] tab, int i, Node<K,V> v) {
// native 方法 更新节点
U.putObjectVolatile(tab, ((long)i << ASHIFT) + ABASE, v);
}

上面这三个方法都是native方法,依赖于未开源的sun.misc.Unsafe类,这个类太强大了,而且好多都是绕开JVM的方法,以后要好好研究一下。