首先Java内存模型不是“JVM 的内存模型”;html
Java线程之间的通讯采用的是共享内存模型,这里提到的共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入什么时候对另外一个线程可见。缓存
从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每一个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。架构
本地内存是JMM的一个抽象概念,并不真实存在;它涵盖了缓存,写缓冲区,寄存器以及其余的硬件和编译器优化。并发
Java 内存模型规定全部的变量都是存在主存当中(相似于前面说的物理内存),每一个线程都有本身的工做内存(相似于前面的高速缓存)。app
线程对变量的全部操做都必须在工做内存中进行,而不能直接对主存进行操做,而且每一个线程不能访问其余线程的工做内存。 优化
Java 内 存 模 型 的 Volatile 关 键 字 和 原 子 性 、 可 见 性 、 有 序 性 和 happens-before 关系等。spa
一.Volatile 关键字 http://www.javashuo.com/article/p-aaxsucvz-cy.html线程
二.要想并发程序正确地执行,必需要保证原子性、可见性以及有序性。 只要有一个没有被保证,就有可能会致使程序运行不正确。3d
happens-before 原则(先行发生原则,有序性):htm
程序次序规则:一个线程内,按照代码顺序,书写在前面的操做先行发生于书写在 后面的操做
锁定规则:一个 unLock 操做先行发生于后面对同一个锁的 lock 操做
volatile 变量规则:对一个变量的写操做先行发生于后面对这个变量的读操做
传递规则:若是操做 A 先行发生于操做 B,而操做 B 又先行发生于操做 C,则能够 得出操做 A 先行发生于操做 C
线程启动规则:Thread 对象的 start()方法先行发生于此线程的每一个一个动做
线程中断规则:对线程 interrupt()方法的调用先行发生于被中断线程的代码检测 到中断事件的发生
线程终结规则:线程中全部的操做都先行发生于线程的终止检测,咱们能够经过 Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行
对象终结规则:一个对象的初始化完成先行发生于他的 finalize()方法的开始。
硬件内存架构:https://www.cnblogs.com/theRhyme/p/9600148.html