关于volatile关键字可见性与原子性的问题
最近在看Java多线程的书,学习到volatile的时候对可见性与原子性有很大的疑惑。
第一个例子:volatile修饰init_value
Reader线程从主内存获取init_value的值0,并将其缓存到本地工作内存。
Updater线程将init_value的值在本地工作内存中修改为1,然后立即刷新至主内存中。导致Reader线程在本地工作内存中的init_value失效,需要到主内存中重新读取。
这个例子是volatile保证可见性
第二个例子:volatile变量的自增操作
volatile变量arg初始值为0
线程A读取了arg,阻塞
线程B读取arg,对其++,并写回主存,此时arg=1
根据可见性,线程A工作内存中的arg变量应该会失效
此时线程A需要重新从主存中读取arg=1,然后进行++操作,将结果2写回内存
但为什么这里线程A中的arg值不会重新读取,依然是之前读取的0,导致arg被写两次都是1
如果是这样,那么在第一个例子中init_value也不会重新从主内存中读啊
实在被弄迷糊了,望各位大神赐教