JAVA并发容器源码分析【二】ConcurrentHashMap分析之tabAt-casTabAt-setTabAt

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】
免费领取10G资料包与项目实战视频资料

文章首发于: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) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » JAVA并发容器源码分析【二】ConcurrentHashMap分析之tabAt-casTabAt-setTabAt

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏