正常线程在读写变量时,都是先操作自己工作内存中的变量,再通过Store操作写回主内存,这在并发情况下就会出现数据不一致的情况;
可见性:
底层加上了汇编的lock前缀指令,锁定缓存,并写回主内存,其他处理器通过嗅探机制使自己的缓存无效;
防止指令重排:
增加了内存屏障;
硬件屏障
- Load Barrier:指令前插入,可使缓存失效,从主内存中读;
- Store Barrier:指令前插入,可使最新数据直接写入主内存,并让其他线程可见;
Java屏障
Java基于这两个屏障组合出4种屏障来使volatile前后的读写指令禁止重排;