第三章 java内存模型
内存模型简介
JMM(java内存模型Java Memory Model)本身是一种抽象的概念,描述的是一组规则或规范。通过这组规范定义了程序中各个变量的访问方式。Java本身的运行是基于虚拟机的,在虚拟机的规范中,Java定义了一种内存模型,来屏蔽掉硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java 线程之间的通信由 Java 内存模型控制的,下图就是java内存模型的抽象结构
内存模型的组成
- 主内存:就是各个线程共享的序曲,对应着jvm虚拟机堆区
- 本地内存:这个区域就是每个线程独有区域,不同线程不能相互访问,对应着jvm虚拟机栈
- 工作方式:
线程A把本地内存A中更新过的共享变量刷新到主内存
线程B到主内存中去读取线程A之前已更新过的共享变量
内存模型在保证有序性时的两个原则
- as-if-seria
不管如何重排序,单线程程序的执行结果不能被改变 - happens-before
在jmm中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happers-before关系
1.程序顺序规则
一个线程中的每个操作,happens-before 于该线程中的任意后续操作
2.监视器锁规则
对一个锁的解锁,happens-before于随后对这个锁的加锁
3.volatile变量规则
对一个volatile域的写,happens-before 于任意后续对这个volatile域的读
4.传递性
如果A happens-before B,且 B happens-before C ,那么 happens-before C
并发三大特性
-
原子性
原子本意是不能再进一步分割的最小粒子,而原子操作就是一个不可中断操作。
1.处理器
是通过对总线锁或者缓存锁进行锁定保证原子性
2.java
可以通过锁或者CAS方式来实现原子操作 -
有序性
1.通过volatile 修改,来实现,原理通过内存屏障实现
2.通过锁,来实现 例如synchronized -
可见性
略