gpt4 book ai didi

java - Java 中使用原子变量的线程安全

转载 作者:行者123 更新时间:2023-12-03 06:12:27 24 4
gpt4 key购买 nike

我有一个 Java 类,这是它的代码:

public class MyClass {
private AtomicInteger currentIndex;
private List<String> list;

MyClass(List<String> list) {
this.list = list; // list is initialized only one time in this constructor and is not modified anywhere in the class
this.currentIndex = new AtomicInteger(0);
}

public String select() {
return list.get(currentIndex.getAndIncrement() % list.size());
}
}

现在我的问题:

仅使用 AtomicInteger ,该类真的是线程安全的吗?还是必须有额外的线程安全机制来确保线程安全(例如锁)?

最佳答案

currentIndex.getAndIncrement()的使用是完全线程安全的。但是,您需要更改代码以使其在所有情况下都是线程安全的。

字段 currentIndexlist 需要设为 final 以实现完全线程安全,即使在不安全地发布对您的引用的情况下也是如此。 MyClass 对象。

private final AtomicInteger currentIndex;
private final List<String> list;

实际上,如果您始终确保您的 MyClass 对象本身是安全发布的,例如,如果您在主线程上创建它,然后使用它的任何线程启动之前,那么您不需要这些字段是final

安全发布意味着对 MyClass 对象本身的引用是以在 the Java Memory Model 中保证多线程排序的方式完成的。 。

可能是这样的:

  • 所有使用该引用的线程都从一个由启动它们的线程在其线程启动之前初始化的字段获取该引用
  • 使用该引用的所有线程都从与设置引用的代码在同一对象上同步的方法获取该引用(您有该字段的同步 getter 和 setter)
  • 您将包含引用的字段设置为 volatile
  • 如果 Final 字段按照 section 17.5 of the JLS. 中所述进行初始化,则该字段位于 final 字段中
  • 还有一些不太容易用来发布引用文献的情况

关于java - Java 中使用原子变量的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56511539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com