0

我想编写一个线程安全的方法 sum() 但我不确定是否可以使用两个 AtomicInteger 来使其安全,还是必须使用同步块?

class A {

   private AtomicInteger a = new AtomicInteger();
   private AtomicInteger b = new AtomicInteger();

   public void sum(int c) {
      a.set(a.get() + b.get() + c);
   }
}
4

2 回答 2

2

Java 中的求值顺序规则意味着您将始终遵循一系列不重叠的锁:A (get) -> B (get) -> A (set)。所以你不会有任何阻塞问题,因为锁不会相互干扰。但是请注意,存在一种竞争条件:线程 1 可能先读取 A,然后再读取 B。在线程 1 设置 A 之前,线程 2 可以读取 A 和 B。最终值将是其中一个线程' 结果总和,但另一个将丢失。

于 2019-11-24T18:50:14.970 回答
1

AntomicInteger 有特定的方法来处理这个问题。你不需要打破 AtomicInteger 这个词,它是线程安全的。只需检查 AtomicInteger 的 JavaDocs 就会向您展示可以用于此的AtomicInteger.getAndAdd之类的方法。

于 2019-11-24T18:35:25.950 回答