import java.util.concurrent.atomic.AtomicInteger;
class Counter implements Runnable {
private static AtomicInteger i = new AtomicInteger(3);
public void run() {
System.out.print(i.getAndDecrement());
}
}
public class Test {
public static void main(String[] args) {
Thread t1 = new Thread(new Counter());
Thread t2 = new Thread(new Counter());
Thread t3 = new Thread(new Counter());
Thread[] threads = {t1, t2, t3};
for(Thread thread : threads) {
thread.start();
}
}
}
我多次运行此代码,并且总是得到 321 作为答案,但我不确定此代码是否可以获得任何其他输出。
AtomicIntegers 线程安全吗?
是的。 在您的示例中,
getAndDecrement
保证从 AtomicInteger 中减去 1,并返回预减值。
代码的输出是不确定的还是确定的?
对我来说这是不确定的。
非确定性有两个原因:
线程可以安排以不同的顺序运行。 这意味着三个线程调用
getAndDecrement
的顺序可能不同。
代码也在输出堆栈中隐式同步。 线程获取竞争锁的顺序是不确定的。
(请注意,虽然1中存在不确定性,但这不是不确定性输出的原因。这是由2引起的。)