我已经阅读了很多有关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());
}