volatile读的时候直接从主存读,还是发现自己的缓存行失效了才从主存读?
volatile读的时候直接从主存读
volatile读的时候是执行load指令,去主内存获取变量值,之后复制一份给本地栈内存,但写的时候,会执行store指令,写完,立即同步到主内存,这样就保证你在读取的时候永远是最新的值,但你如果有2个以上线程,比如3个,第一个把变量改为1,第二个读取到的是1,第三个也读取到的是1,第三个线程先改为2,但第二个线程已经读取过了,这时候它并不知道数据已经改为2了,逻辑处理的时候还是1,这时候就出现了线程不安全了,这也是它替代不了锁的原因,不能保证对变量的操作只能有一个线程处理,不能做到原子性;
所以volatile适合于只有1个线程需改变量的多线程,比如一个线程写,多个线程度,这样他就是线程安全的,而且不用枷锁;