孤芳不自赏

玩命工作,就是年轻时最好的生活。

使用关键字volatile时出现非线程安全的原因。

变量在内存中工作的过程如下图所示。


由上,我们可以得出以下结论。

  1. read和load阶段:从主存复制变量到当前线程工作内存;
  2. use和assign阶段:执行代码,改变共享变量值;
  3. store和write阶段:用工作内存数据刷新主存对应变量的值。

       在多线程环境中,use和assign是多次出现的,但这一操作并不是原子性,也就是在read和load之后,如果主内存count变量发生修改之后,线程工作内存中的值由于已经加载,不会产生对应的变化,也就是私有内存和公共内存中的变量不同步,所以计算出来的结果会和预期不一样,也就出现了非线程安全问题。

      对于用volatile修饰的变量,JVM虚拟机只是保证从主内存加载到线程工作内存的值是最新的,例如线程1和线程2在进行read和load的操作中,发现主内存中count的值都是5,那么都会加载这个最新的值。也就是说,volatile关键字解决的是变量读时的可见性问题 ,但无法保证原子性,对于多个线程访问同一个实例变量还是需要加锁同步。

阅读更多
文章标签: java 多线程
个人分类: java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

使用关键字volatile时出现非线程安全的原因。

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭