Java并发易变变量

时间:2018-11-24 17:42:02

标签: java concurrency volatile

我已经阅读了很多有关Java并发编程的信息,但是我不确定我是否了解volatile变量及其适用范围。我正在编写此代码,该代码应提供100000作为输出,但事实并非如此。我知道这是因为线程同时读取和写入变量,但是据我所知,它应该工作在什么可变状态。如果我使用synchronized进行操作,它将起作用。如果有人能解释为什么此代码不起作用,我将不胜感激。

public class A {
private volatile long a = 0;
public A(long a) {
    this.a = a;
}
public void increment() {
    a = a + 1;
}
public long getA() {
    return a;
}

}

public static void main(String[] args) throws InterruptedException {
    A a = new A(0L);
    Runnable r1 = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                a.increment();
            }
        }
    };
    Thread[] threads = new Thread[1000];

    for (int i = 0; i < threads.length; i++) {
        threads[i] = new Thread(r1);
        threads[i].start();
    }
    for (int i = 0; i < threads.length; i++) {
        threads[i].join();
    }
    System.out.println("Value = " + a.getA());
}

0 个答案:

没有答案