JMM内存模型
JVM内存模型:指Java虚拟机内存分区; JMM内存模型:虚拟机规范,屏蔽OS和硬件差异。规范Java虚拟机和计算机内存如何工作,
原子性
定义8中原子操作(lock,unlock,read,write,load,store,use,assign)
JMM要求8个操作都是原子性,对于基本数据类型,可以保证其原子性,对于64位的数据类型(long,double)由于缓存行限制,在未声明volatile的情况下,不保证原子性。
可见性
volatile保证可见性,一个线程的修改会立即刷新到主存,保证其他线程可见。
有序性
as-if-serial:
不管如何指令重排序,单线程的执行结果不能被改变,单线程表现为串行。
happens-before:
不是说前一个操作必须在后一个操作之前执行,如果一个操作的结果对另一个可见,且前一个操作排在后一个之前。必需要存在happens-before关系。
指令重排序:
1.JIT即时编译器可以优化执行的执行顺序。
2.指令级别重排序,处理器改变指令执行顺序。
3.内存重排序,缓存读写,导致内存加载和存储看起来是乱序。
volatile(可见性)
1.禁止指令重排序:插入内存屏障(memory barriers)
2.可见性:使用Lock指令禁止变量在线程工作内存中缓存。读(使内存中失效,要去从主从获取),写(要求本地内存立即刷新到主存)
synchronized(可见性, 原子性)
底层使用mutex lock实现(monitorenter,monitorexit)
对象头
锁升级
无锁、偏向锁、轻量级锁、重量级锁(悲观锁)