一个变量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变量的缓存。
问:这时候可见性不发挥作用么?
萧十郎
青春有我
慕斯王
相关分类