java

位置:IT落伍者 >> java >> 浏览文章

java多线程的volatile关键字


发布日期:2018年10月30日
 
java多线程的volatile关键字

以前一直没在意一直以为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关键字修改之后还是会存在并发的情况

               

上一篇:Java servlet多线程

下一篇:java 设计模式之 观察者模式(Observer)