package thread;
public class VolatileDemo {
//用以聲明變量的值可能隨時會別的線程修改,使用volatile修飾的變量會強制將修改的值立即寫入主存
//volatile不具備原子性(哪些指令是不允許分割的),這是volatile與java中的synchronized、Lock最大的功能差異
private volatile int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void add(){
int x = getA();
setA(x+1);
}
public static void main(String[] args) throws InterruptedException {
final VolatileDemo volatileDemo = new VolatileDemo();
for (int i = 0; i < 10000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
volatileDemo.add();
}
}).start();
}
Thread.sleep(10000);
//此處輸出一定不會是10000,因爲Volatile不保證原子性
System.err.println(volatileDemo.getA());
}
}