JMM内存模型

144 阅读1分钟

JMM内存模型

JVM内存模型:指Java虚拟机内存分区; JMM内存模型:虚拟机规范,屏蔽OS和硬件差异。规范Java虚拟机和计算机内存如何工作,

preview

原子性

定义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)

对象头

锁升级

无锁、偏向锁、轻量级锁、重量级锁(悲观锁)

CAS