我想编写一个线程安全的方法 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);
}
}
我想编写一个线程安全的方法 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);
}
}
Java 中的求值顺序规则意味着您将始终遵循一系列不重叠的锁:A (get) -> B (get) -> A (set)。所以你不会有任何阻塞问题,因为锁不会相互干扰。但是请注意,存在一种竞争条件:线程 1 可能先读取 A,然后再读取 B。在线程 1 设置 A 之前,线程 2 可以读取 A 和 B。最终值将是其中一个线程' 结果总和,但另一个将丢失。
AntomicInteger 有特定的方法来处理这个问题。你不需要打破 AtomicInteger 这个词,它是线程安全的。只需检查 AtomicInteger 的 JavaDocs 就会向您展示可以用于此的AtomicInteger.getAndAdd之类的方法。