1.一般程序运行,访存流程
2.java线程,自有JMM内存模型,访存流程
img
理解:
43 可见 3锁(volatile,synchronized,lock,atominc)

线程 43JMM    **可见性==直接主存操作

-1.本质上,开了一手线程工作内存和存取规则  而这个线程内存其实就是cpu的高速度缓存,

        为什么要开缓存是为了效率考虑,cpu和主存速度不一致,每次从主存中取开销大,给高频数据做缓存

-2.同步首先满足的就是可见性,不走缓存,避免缓存一致性问题,然后考虑封装成原子块

        可见性,保证唯一缓存有效(清其他工作内存),相当于直接不走缓存(每次取都得从主存取)

              例如开个volatile具体实现:当前线程缓存被更新后,立即同步到主存,且立即清除其它线程的该变量缓存
        
              所以说唯一缓存生效,就理解成直接主存操作也行

       volatile作为一种最弱的同步机制,只保证可见性和有序性(内存屏障实现),不保证原子性,一个轻量级的synchronized,适用场景比较少
            
            常见的,如单例模式的双重校验
        
            大量只读操作,直接用这个解决缓存一致问题保证同步

            优点:不用锁,不会线程阻塞,在特定场景性能非常好

ps:1.线程非同步走缓存,速度快  2.需要同步的就直接主存操作,该有的代价得有