1.一般程序运行,访存流程
2.java线程,自有JMM内存模型,访存流程
理解:
43 可见 3锁(volatile,synchronized,lock,atominc)
线程 43JMM **可见性==直接主存操作
-1.本质上,开了一手线程工作内存和存取规则 而这个线程内存其实就是cpu的高速度缓存,
为什么要开缓存是为了效率考虑,cpu和主存速度不一致,每次从主存中取开销大,给高频数据做缓存
-2.同步首先满足的就是可见性,不走缓存,避免缓存一致性问题,然后考虑封装成原子块
可见性,保证唯一缓存有效(清其他工作内存),相当于直接不走缓存(每次取都得从主存取)
例如开个volatile具体实现:当前线程缓存被更新后,立即同步到主存,且立即清除其它线程的该变量缓存
所以说唯一缓存生效,就理解成直接主存操作也行
volatile作为一种最弱的同步机制,只保证可见性和有序性(内存屏障实现),不保证原子性,一个轻量级的synchronized,适用场景比较少
常见的,如单例模式的双重校验
大量只读操作,直接用这个解决缓存一致问题保证同步
优点:不用锁,不会线程阻塞,在特定场景性能非常好
线程 43JMM **可见性==直接主存操作
-1.本质上,开了一手线程工作内存和存取规则 而这个线程内存其实就是cpu的高速度缓存,
为什么要开缓存是为了效率考虑,cpu和主存速度不一致,每次从主存中取开销大,给高频数据做缓存
-2.同步首先满足的就是可见性,不走缓存,避免缓存一致性问题,然后考虑封装成原子块
可见性,保证唯一缓存有效(清其他工作内存),相当于直接不走缓存(每次取都得从主存取)
例如开个volatile具体实现:当前线程缓存被更新后,立即同步到主存,且立即清除其它线程的该变量缓存
所以说唯一缓存生效,就理解成直接主存操作也行
volatile作为一种最弱的同步机制,只保证可见性和有序性(内存屏障实现),不保证原子性,一个轻量级的synchronized,适用场景比较少
常见的,如单例模式的双重校验
大量只读操作,直接用这个解决缓存一致问题保证同步
优点:不用锁,不会线程阻塞,在特定场景性能非常好
ps:1.线程非同步走缓存,速度快 2.需要同步的就直接主存操作,该有的代价得有