Java内存模型即Java Memory Model,简称JMM。
一、主内存与工作内存:
1.Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存。
2. 线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。
3. 不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成。
线程、主内存和工作内存的交互关系如下图所示:
二、内存间交互操作:
Java内存模型定义了以下八种操作来完成:
lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。
unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。
write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。
三、重排序:
在执行程序时为了提高性能,编译器和处理器经常会对指令进行重排序。
重排序分成三种类型:
编译器优化的重排序。编译器在不改变单线程程序语义放入前提下,可以重新安排语句的执行顺序。
指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
内存系统的重排序。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
相关推荐
深入理解 java 内存模型是 java 程序员的必修课,看看原汁原味正宗的内存模型吧
java 内存模型 java 内存模型 java 内存模型 java 内存模型
java内存模型文档
Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main ...
Java 内存模型的抽象 4 重排序 6 处理器重排序与内存屏障指令 7 happens-before 10 重排序 13 数据依赖性 13 as-if-serial 语义 13 程序顺序规则 15 重排序对多线程的影响 15 顺序一致性 19 数据竞争与顺序...
深度剖析java内存模型深度剖析java内存模型深度剖析java内存模型
深入理解 Java 内存模型,由程晓明编著,深入理解java内存模型JMM
深入Java 内存模型本书介绍了,如何深入学习了解JAVA 内存模型!更好的了解java 虚拟机!
深入理解Java内存模型 pdf 超清版
关于同步和线程安全的许多底层混淆是Java内存模型的一些难以直觉到的细微差别。本文还介绍了JMM有一些严重的缺点,如果正确地编写并发的类太困难的话,那么许多并发的类不能按预期工作,并且这是平台中的一个缺点。...
java内存模型.pdf
理解java内存模型的一本不错的书。
java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰java程序员,本文试图揭开java内存模型神秘的面纱。本文大致分三部分:重排序与顺序一致性;三个同步原语(lock,volatile,final)的内存语义,重...
Java内存模型详解,JVM结构..
学习java内存模型,理解深层意义
java 锁 内存模型, 对于想了解cpu锁,内存模型的同学是很不错的资料
JAVA内存模型与垃圾回收 JAVA内存模型与垃圾回收 JAVA内存模型与垃圾回收
深入理解JAVA内存模型.pdf (高清版) 1.基础 2.重排序 3.顺序一致性 4.voltile 5.锁 6.FInal 7.总结。。。等等
Java内存模型和线程安全,多线程开发,高并发处理,内存模型分析