142°

java并发-volatile关键字

说volatile的时候,必须先说一说,java的内存模型。

当一个线程操作共享变量时, 它首先从主内存复制共享变量到自己的工作内存 , 然后对工作内存里的变量进行处理,处理完后将变量值更新到主内存。

上面只是一个抽象的概念,真实的情况如下图。

线程1要使用共享变量count,从L1缓存中取,发现没有从L2缓存中取,也没有,接着从主内存中取。取到了值count=0,并把变量缓存到两级缓存。

这时线程2修改count的值, 首先会从L1缓存中取,发现没有,从L2缓存中取,缓存命中。然后修改count=1,更新线程2的L1 Cache 和 L2 Cache,最后更新主内存中的值为1. 

这时候线程1要修改count =1,获取线程1里的L1 cahce,取得count=0。明明线程2已经修改count为1,线程1获取到的值确还是缓存里的值0。这 就是共享变量的内存不可见问题。

volatile就可以解决这个可见性的问题,可以猜想一下它是怎么做到的?

对于volatile的变量,我不写缓存,直接写到主内存,读的时候,我直接从主内存读取。

当 一个变量被声明为 volatile 时,线程在写入变量时不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存 。 当其他线程读取该共享变量时 ,会从主内存重新获取最新值,而不是使用当前线程的工作内存中的值。
 

 

本文由【万】发布于开源中国,原文链接:https://my.oschina.net/suzheworld/blog/3061765

全部评论: 0

    我有话说: