package basic;
public class TestVolatile {
public volatile static int count = 0;
public static void increase() {
try {
// 延迟10毫秒,使得结果明显
Thread.sleep(10);
count++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
TestVolatile.increase();
}
}).start();
}
System.out.println("期望运行结果:10000");
System.out.println("实际运行结果:" + TestVolatile.count);
}
}
代码如下,由于volatile的read and load操作并不是原子性的,它只保证了从主内存读到栈内存的值是最新的,因此上述代码运行结果并不是语气的10000。
问题:
1.既然volatile并没有保证原子性,为什么还要使用它?
2.JDK中针对volatile的这种弊端,还做了哪些设计来弥补这一缺憾?
白板的微信
相关分类