多线程 - 一个关于Java volatile关键字可见性和原子性的问题
本文介绍了多线程 - 一个关于Java volatile关键字可见性和原子性的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
一个变量arg用volatile修饰后,会直接保存在主存中
有两个线程A和B访问它
A和B同时将arg读取到了工作内存
若A对arg进行修改后,会导致B工作内存中的arg缓存无效
所以线程B需要再次从主存中读取arg
这就保证了线程B读取的是arg的最新值
问题:
线程A和线程B都对arg变量进行++操作
++操作的过程为,先读取arg,对arg加1,然后写回主存
假设:
arg初始值为0
线程A读取了arg,阻塞
线程B读取arg,对其++,并写回主存,此时arg=1
根据可见性,线程A工作内存中的arg变量应该会失效
此时线程A需要重新从主存中读取arg=1,然后进行++操作,将结果2写回内存
然而:
看了一些博客,都没有涉及到加粗文字的步骤。
按照这样的说法,arg会被写两次,每次都是1。
线程A读取arg放入工作内存后,线程B的写操作不会影响线程A工作内存中arg变量的缓存。
问:这时候可见性不发挥作用么?
解决方案
volatile保证你每次读取都能读到最新的值,可是并不会更新你已经读了的值,它也无法更新你已经读了的值。
这篇关于多线程 - 一个关于Java volatile关键字可见性和原子性的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文