JAVA memory model
JMM和cpu的多核并发访问模型相像
主内存中有一个共享变量 initFlag
当多线程同时访问时就出现了并发问题:
jmm针对这种缓存不一致的情况有2种解决方案:
- 1总线加锁 性能太低,近乎单cpu,单线程操作了
- 2 MESI缓存一致性协议,通过cpu总线嗅探机制感知数据的变化,然后使之前加载到工作内存的值失效 锁粒度小了很多,只在write阶段
使用volatile可以保证可见性和有序性,但还不能保证原子性,要想实现原子性,还要使用synchronized机制
并发编程的三大特性:可见性,有序性,原子性
JMM数据的原子操作包含了下图的流程 ,和 lock ,unlock