AtomicInteger原子

时间:2014-12-09 06:33:55

标签: java

import java.util.concurrent.atomic.AtomicInteger;

public class Volatiletest extends Thread {

    private static AtomicInteger atomic = new AtomicInteger(0);

    public void run() {
        atomic.getAndIncrement();
    }

    public static void main(String[] args) {
        Thread threads[] = new Thread[100];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Volatiletest();
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        System.out.println(atomic.get());
    }
}

代码如上。 我认为输出是100,但输出是随机的,如99,98,100 ...... 有人可以解释一下吗?

2 个答案:

答案 0 :(得分:4)

在打印结果之前,您没有等待线程返回。因此,您无法保证在调用System.out.println()之前所有增量操作都已发生。

答案 1 :(得分:2)

在所有线程完成甚至开始之前,您的print语句正在执行,您的计数会有所不同。

你需要在所有线程上调用join来使主线程等到它们完成为止。

// Spawn all threads
for (int i = 0; i < threads.length; i++) {
    threads[i].start();
}

// Wait for each thread to finish
for (int i = 0; i < threads.length; i++) {
    threads[i].join();
}

System.out.println(atomic.get());