2019-10-30 09:18  阅读(2532)
文章分类:Java 并发容器源码分析 文章标签:Java 并发Java 并发容器Java 并发源码Java 并发容源码
©  原文作者:iTimeTraveler 原文地址:https://github.com/iTimeTraveler/SortAlgorithms

文章首发于:clawhub.club


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

tabAt

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

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。

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。

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的方法,以后要好好研究一下。


来源:https://www.jianshu.com/p/a75d196731c0

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> JAVA并发容器源码分析【二】ConcurrentHashMap分析之tabAt-casTabAt-setTabAt
上一篇
JAVA并发容器源码分析【二】ConcurrentHashMap分析之数据结构(JDK7与JDK8)
下一篇
JAVA并发容器源码分析【二】ConcurrentHashMap分析之get