JMM介绍
JMM是基于CPU缓存模型实现的一套Java内存管理程序,都在于解决多核情况下的缓存同步问题。它定义了主存和工作内存的抽象概念,底层对应着CPU寄存器、高速缓存、RAM、CPU指令优化等。
CPU缓存模型
JMM特性
- 可见性:volatile可以保证不同线程对共享变量进行操作时的可见性。即当一个线程修改了共享变量时,另一个线程可以读取到共享变量被修改后的值。
- 有序性:volatile会通过禁止指令重排序进而保证有序性。
- 原子性:对于单个的volatile修饰的变量的读写是可以保证原子性的,但对于
i++
这种复合操作并不能保证原子性。这句话的意思基本上就是说volatile不具备原子性了。
JMM特性的应用方式
- 同时实现可见性、有序性、原子性需要使用synchronized,但是耗费性能;
- 同时实现可见性、有序性需要给共享变量加上volatile修饰符,也就是适用于仅有一个线程修改,其它线程读取的场景。
可见性
volatile可见性实现原理
如图所示,别看加了一个volatile,但是底层实现很繁杂,首先要确保开启缓存一致性协议,每个线程都要开启总线嗅探机制, 会给主存的变量加锁,然后基于以上步骤实现可见性
如果存在资源的竞争,这时需要加上锁来资源分配以保证线程资源安全
有序性
原子性
【注:】上图主存指的是所有线程共享的数据,比如公共静态成员变量、公共成员变量,而工作内存是线程自己私有的数据