Java内存模型

首先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

相关文章
相关标签/搜索