以前一直没在意一直以为volatile修饰了就高枕无忧了但其实不然最简单的一个场景
public class Counter {
public volatile static int count = ;
public static void inc() {
//这里延迟毫秒使得结果明显
try {
Threadsleep();
} catch (InterruptedException e) {
}
count++;
}
public static void main(String[] args) {
//同时启动个线程去进行i++计算看看实际结果
for (int i = ; i < ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
Counterinc();
}
})start();
}
//这里每次运行的值都有可能不同可能为
Systemoutprintln(运行结果:unt= + unt);
}
}
这里运行结果依然不是期望的主要原因简单解释如下
对于volatile修饰的变量jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的
例如假如线程线程 在进行readload 操作中发现主内存中count的值都是那么都会加载这个最新的值
在线程堆count进行修改之后会write到主内存中主内存中的count变量就会变为
线程由于已经进行readload操作在进行运算之后也会更新主内存count的变量值为
导致两个线程及时用volatile关键字修改之后还是会存在并发的情况