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());
}
}