是否可以使用具有两个 AtomicInteger 的线程安全方法?
Is a Thread-safe method with two AtomicIntegers possible?
我想写一个线程安全的方法 sum() 但我不确定我是否可以使用两个 AtomicIntegers 来确保它安全,或者我是否必须使用同步块?
class A {
private AtomicInteger a = new AtomicInteger();
private AtomicInteger b = new AtomicInteger();
public void sum(int c) {
a.set(a.get() + b.get() + c);
}
}
AntomicInteger 有特定的方法来处理这个问题。您不需要突破 AtomicInteger 字,它是线程安全的。
只需检查 AtomicInteger 的 JavaDocs 就会向您展示诸如 AtomicInteger.getAndAdd 之类的方法,您可以将其用于此。
The rules for evaluation order in Java 意味着你将始终遵循一系列不重叠的锁:A(get)-> B(get)-> A(set)。所以你不会有任何阻塞问题,因为锁不会相互干扰。但是请注意,存在一种竞争条件形式:线程 1 可能读取 A,然后读取 B。在线程 1 设置 A 之前,线程 2 可以读取 A 和 B。最终值将是其中一个线程' 结果总和,但另一个将丢失。
我想写一个线程安全的方法 sum() 但我不确定我是否可以使用两个 AtomicIntegers 来确保它安全,或者我是否必须使用同步块?
class A {
private AtomicInteger a = new AtomicInteger();
private AtomicInteger b = new AtomicInteger();
public void sum(int c) {
a.set(a.get() + b.get() + c);
}
}
AntomicInteger 有特定的方法来处理这个问题。您不需要突破 AtomicInteger 字,它是线程安全的。 只需检查 AtomicInteger 的 JavaDocs 就会向您展示诸如 AtomicInteger.getAndAdd 之类的方法,您可以将其用于此。
The rules for evaluation order in Java 意味着你将始终遵循一系列不重叠的锁:A(get)-> B(get)-> A(set)。所以你不会有任何阻塞问题,因为锁不会相互干扰。但是请注意,存在一种竞争条件形式:线程 1 可能读取 A,然后读取 B。在线程 1 设置 A 之前,线程 2 可以读取 A 和 B。最终值将是其中一个线程' 结果总和,但另一个将丢失。