volatile变量 java多线程的volatile关键字
java多线程的volatile关键字
以前一直没在意 一直以为volatile修饰了就高枕无忧了 但其实不然 最简单的一个场景

public class Counter {
public volatile static int count = ;
public static void inc() {
//这里延迟 毫秒 使得结果明显
try {
Thread sleep( );
} catch (InterruptedException e) {
}
count++;
}
public static void main(String[] args) {
//同时启动 个线程 去进行i++计算 看看实际结果
for (int i = ; i < ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
Counter inc();
}
}) start();
}
//这里每次运行的值都有可能不同 可能为
System out println( 运行结果:unt= + unt);
}
}
这里运行结果依然不是期望的 主要原因简单解释如下
对于volatile修饰的变量 jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的
例如假如线程 线程 在进行read load 操作中 发现主内存中count的值都是 那么都会加载这个最新的值
在线程 堆count进行修改之后 会write到主内存中 主内存中的count变量就会变为
线程 由于已经进行read load操作 在进行运算之后 也会更新主内存count的变量值为
lishixinzhi/Article/program/Java/gj/201311/27567