Volatile AtomicInteger不工作

Adi*_*tya 1 java multithreading

嗨,我在尝试挥发性.我从我的主线程创建10个线程,并从每个线程打印静态计数器的值.

输出是不确定的.任何人都可以让我知道为什么它不起作用.

public class Main {
    static AtomicInteger  counter = new AtomicInteger(0);

    public static void main(String[] args) {
        while(counter.getAndIncrement() < 10){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println(counter.get());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里我也尝试改变计数器为

static volatile int counter = 0;
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

3 3 6 6 7 7 10 10 11 11

输出每次都不同.我不指望它们按正确顺序排列,但我期望从0到10的唯一值.

Kay*_*man 6

您有一个增加值的线程,以及获取并显示该值的多个线程.显然,增量线程有很多潜力,然后其余线程打印相同的值.仅仅因为你调用start()并不意味着线程会在值递增之前运行.

如果你把它get()放在while循环中,并incrementAndGet()在其他线程中使用,你将得到唯一的值(虽然你可能会得到超过10).

如果要打印10个不同的值,代码将不起作用.

使用原始代码,您可以创建10个线程,但是当它们运行时,它们将打印计数器的当前值.如果3个启动的线程运行,它们将始终打印相同的值.

当你get()进入while循环时,它可以并且将创建超过10个线程,因为增量计数器的其他线程将没有机会运行,导致线程被创建,直到10个递增线程运行.之后仍然有剩下的线程被创建,但还没有运行 - >你得到10 +额外的线程.

如果要使用线程,则无法使用单个计数器变量获得所需的输出.