首先JVM内存模型诞生的背景,因为为了发挥cpu最大的性能,我们引入了cpu缓存,从而出现了缓存带来的可见性问题,同时也引入了指令重排序,从而也出现了指令的顺序性问题,为了解决这些问题,硬件层面采用了内存屏障,MESI协议解决了这些复杂的执行逻辑问题,而在jvm层面,缓存问题就抽象成了工作内存和主内存的问题,各个线程拥有自己私有的工作内存,各个线程共享主内存里面的数据,同样的也存在了可见性等问题,而在jvm层面就推出了jvm内存模型来解决这些问题
jvm内存模型是一组规范,它规定了各个线程操作共享变量的顺序问题
最主要的规则体现在happens-before
程序顺序规则:指的是线程中的每个操作happens before于这个操作的后续操作
监视器锁规则:指的是对每个对象的解锁操作happens before于对这个对象的后续加锁操作
volatile变量规则:对volatile的写操作happens before与对这个对象的后续读操作
start规则:线程A对线程B的start操作happens before于线程B的任意操作
join规则:线程B 的任意操作happens before 于线程A执行线程B 的join方法成功返回
传递规则:如果Ahappens before 于B,Bhappens before于C,那么Ahappens before于C。
volatile是对JMM规则的部分实现,解决了以上可见性,有序性的问题
剩下的原子性问题的解决方案有:CAS , 锁
CAS (耗cpu,单个元素,ABA问题[时间戳 版本号解决])
具体实现在atomic等原子操作的封装类
锁
Synchronized 同步关键字
AQS 抽象队列同步器
具体的在我的后续讲一讲系列都会有讲解.