前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AtomicStampedReference 源码分析

AtomicStampedReference 源码分析

作者头像
itliusir
发布2020-02-10 10:52:21
3940
发布2020-02-10 10:52:21
举报
文章被收录于专栏:刘君君刘君君

摘要:

  1. CAS ABA 是什么
  2. AtomicStampedReference 是怎么解决 CAS ABA问题的

TOP 带着问题看源码

  1. CAS ABA 是什么
  2. AtomicStampedReference 是怎么解决 CAS ABA问题的

1. 基本介绍

AtomicStampedReference 是对 AtomicReference 的一个补充,解决了在 CAS 场景下 ABA 的问题

2. CAS ABA 是什么

从前面几篇分析,我们已经知道了 CAS 其实是一条 CPU 指令,作用是比较和替换,但是有可能 内存值原本是 A 然后变成 B 最后又变回了 A,这个时候 CAS 比较 A 发现是通过的(认为没有变化或者说是竞争),也就直接更新了,但是实际是有变化的。

一个解决思路就是加一个版本戳,每次更新变量同步更新一下版本号。这样就发现 1A != 3A,也就不会更新成功了。

回到 TOP 1 可以明白在并发情况下出现 ABA 的原因

3. 内部结构

代码语言:javascript
复制
private static class Pair<T> {
    final T reference;
    final int stamp;
    private Pair(T reference, int stamp) {
        this.reference = reference;
        this.stamp = stamp;
    }
    static <T> Pair<T> of(T reference, int stamp) {
        return new Pair<T>(reference, stamp);
    }
}

private volatile Pair<V> pair;

我们可以发现,AtomicStampedReference 对比 AtomicReference,全局维护的不是 T reference,而是 Pair。Pair 对象里多维护了一个 stamp 标识。

4. AtomicStampedReference 的 CAS

代码语言:javascript
复制
public boolean compareAndSet(V   expectedReference,
                             V   newReference,
                             int expectedStamp,
                             int newStamp) {
    Pair<V> current = pair;
    return
      	// 1 引用没变
        expectedReference == current.reference &&
      	// 2 版本号没变
        expectedStamp == current.stamp &&
      	// 3 新引用等于旧引用
        ((newReference == current.reference &&
          // 4 新版本号等于旧版本号
          newStamp == current.stamp) ||
         // 5 构造 Pair 然后 cas
         casPair(current, Pair.of(newReference, newStamp)));
}

可以看到,最后的 return 的逻辑很复杂,我们可以看到多了版本号的校验。

回到 TOP 2 可以明白多加一个维度来保存版本更新信息即可解决。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TOP 带着问题看源码
  • 1. 基本介绍
  • 2. CAS ABA 是什么
  • 3. 内部结构
  • 4. AtomicStampedReference 的 CAS
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档