onlyliuxin / coding2017

216 stars 641 forks source link

volatile i++例子疑惑 #485

Open XingTree opened 7 years ago

XingTree commented 7 years ago

经常看到有人用i++来举volatile不能保证原子性的例子,我有个疑惑.

int volatile i = 0; i定义为volatile,初始为0,两个线程(线程A和线程B)执行i++操作.

线程A读取i的值为0,然后停止,轮到线程B执行. 线程B读取i的值为0,然后执行加1操作,然后刷新i的值回主存,并且让其他引用i的地方CPU缓存行无效. 线程A继续执行,然后i的缓存行不是被线程B弄成无效了吗?为什么不重新去获取i,然后++.

onlyliuxin commented 7 years ago

线程A不会再去主内存取了, 因为对于线程A的i 来说,它的值(0) 已经取到了自己的栈帧中, JVM会用这个值来继续计算