简介
JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。
JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。
Java 语言的内存模型由一些规则组成,这些规则确定线程对内存的访问如何排序以及何时可以确保它们对线程是可见的。
JMM决定一个线程对共享变量的写入何时对另一个线程可见
线程之间的通信
线程之间的通信机制有两种共享内存和消息传递。
1.线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象(比如一个变量值)进行通信。
2.明确的发送消息来显式进行通信,在java中典型的消息传递方式就是wait()等待
和notify()唤醒
。
线程之间的同步
同步是指程序用于控制不同线程之间操作发生相对顺序谁先执行,该谁执行了
的机制。
内存可见性

在现代可共享内存的多处理器体系结构中每个处理器都有自己的缓存,并周期性的与主内存协调一致。假设线程 A 写入一个变量值 V,随后另一个线程 B 读取变量 V 的值,在下列情况下,线程 B 读取的值可能不是线程 A 写入的最新值:
- 执行线程 A 的处理器把变量 V 缓存到寄存器中。
- 执行线程 A 的处理器把变量 V 缓存到自己的缓存中,但还没有同步刷新到主内存中去。
- 执行线程 B 的处理器的缓存中有变量 V 的旧值。
重排序
你无法预知不同线程之间的指令会以何种顺序执行。但是只要所有执行这些代码产生的结果,能够和内存模型预测的结果保持一致。就可以重排序
重排序类型包括:
- 编译器生成指令的次序,可以不同于源代码所暗示的“显然”版本。(不是从上到下执行)
- 处理器可以乱序或者并行的执行指令。
- 缓存会改变写入提交到主内存的变量的次序。
Happens-before 关系
也就是线程执行顺序的关系
happens-before
关系保证:
如果线程 A 与线程 B 满足 happens-before
关系,则线程 A 执行动作的结果对于线程 B 是可见的。如果两个操作未按 happens-before
排序,JVM 将可以对他们任意重排序。
下面介绍几个happens-before 关系法则:
- 程序次序法则:如果在程序中,所有动作 A 出现在动作 B 之前,则线程中的每动作 A 都 happens-before 于该线程中的每一个动作 B。
- 监视器锁法则:对一个监视器的解锁 happens-before 于每个后续对同一监视器的加锁。
- Volatile 变量法则:对 Volatile 域的写入操作 happens-before 于每个后续对同一Volatile 的读操作。
- 传递性:如果 A happens-before 于 B,且 B happens-before C,则 A happens-before C。
参考文章https://blog.csdn.net/suifeng3051/article/details/52611310
网友评论