返回介绍

7.4 原子更新字段类

发布于 2024-08-18 10:09:30 字数 1320 浏览 0 评论 0 收藏 0

如果需原子地更新某个类里的某个字段时,就需要使用原子更新字段类,Atomic包提供了以下3个类进行原子字段更新。

AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。

AtomicLongFieldUpdater:原子更新长整型字段的更新器。

AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子的更新数据和数据的版本号,可以解决使用CAS进行原子更新时可能出现的ABA问题。

要想原子地更新字段类需要两步。第一步,因为原子更新字段类都是抽象类,每次使用的时候必须使用静态方法newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。第二步,更新类的字段(属性)必须使用public volatile修饰符。

以上3个类提供的方法几乎一样,所以本节仅以AstomicIntegerFieldUpdater为例进行讲解,AstomicIntegerFieldUpdater的示例代码如代码清单7-6所示。

代码清单7-6 AtomicIntegerFieldUpdaterTest.java

public class AtomicIntegerFieldUpdaterTest {
  // 创建原子更新器,并设置需要更新的对象类和对象的属性
  private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.
  newUpdater(User.class, "old");
  public static void main(String[] args) {
    // 设置柯南的年龄是10岁
    User conan = new User("conan", 10);
    // 柯南长了一岁,但是仍然会输出旧的年龄
    System.out.println(a.getAndIncrement(conan));
    // 输出柯南现在的年龄
    System.out.println(a.get(conan));
  }
  public static class User {
    private String name;
    public volatile int old;
    public User(String name, int old) {
      this.name = name;
      this.old = old;
    }
    public String getName() {
      return name;
    }
    public int getOld() {
      return old;
    }
  }
}

代码执行后输出如下。

10
11

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文