AtomicIntegers 线程安全并且代码的输出是不确定的还是确定的?

问题描述 投票:0回答:1
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 作为答案,但我不确定此代码是否可以获得任何其他输出。

java concurrency
1个回答
0
投票

AtomicIntegers 线程安全吗?

是的。 在您的示例中,

getAndDecrement
保证从 AtomicInteger 中减去 1,并返回预减值。

代码的输出是不确定的还是确定的?

对我来说这是不确定的。

非确定性有两个原因:

  1. 线程可以安排以不同的顺序运行。 这意味着三个线程调用

    getAndDecrement
    的顺序可能不同。

  2. 代码也在输出堆栈中隐式同步。 线程获取竞争锁的顺序是不确定的。

(请注意,虽然1中存在不确定性,但这不是不确定性输出的原因。这是由2引起的。)

© www.soinside.com 2019 - 2024. All rights reserved.