网站建设营销推广工作,网页设计与网站建设实例教程答案,网站开发 手把手,官方网站建设哪儿有提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 JMM--Java Memory ModelJMM 定义JMM规则#xff1a;线程间通信的步骤#xff1a; JMM的三大特性#xff1a;原子性#xff08;Atomicity#xff09;可见性文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 JMM--Java Memory ModelJMM 定义JMM规则线程间通信的步骤 JMM的三大特性原子性Atomicity可见性有序性 JMM中的八种内存操作 JMM–Java Memory Model 
JMM 定义 JMM 是Java内存模型Java Memory Model简称JMM。它本身只是一个抽象的概念并不真实存在它描述的是一种规则或规范 内存模型描述了程序中各个变量实例域、静态域和数组元素之间的关系以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节JMM 和 JVM的内存结构不是一个东西 
JMM规则 JMM规定了所有的变量都存储在主内存Main Memory中。每个线程还有自己的工作内存Working Memory  线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝线程对变量的所有操作读取、赋值等都必须在工作内存中进行而不能直接读写主内存中的变量volatile变量仍然有工作内存的拷贝但是由于它特殊的操作顺序性规定所以看起来如同直接在主内存中读写访问一般。  不同的线程之间也无法直接访问对方工作内存中的变量线程之间值的传递都需要通过主内存来完成。   全局描述。 在处理指令时CPU会拉取数据优先级是从L1到L2到L3如果都没有需要去主内存中拉取JMM就是在CPU和主内存之间来协调保证可见、有序性等操作。 
CPU核心就是CPU核心寄存器 缓存是CPU的缓存CPU的缓存分为L1线程独享L2内核独享L3多核共享JMM就是Java内存模型的核心可见性有序性都基于这实现。主内存JVM就是你堆内存。 
线程间通信的步骤 
首先线程A把本地内存A中更新过的共享变量刷新到主内存中去。 然后线程B到主内存中去读取线程A之前已更新过的共享变量。  
本地内存A和B有主内存中共享变量x的副本。假设初始时这三个内存中的x值都为0。 
线程A在执行时把更新后的x值假设值为1临时存放在自己的本地内存A中。当线程A和线程B需要通信时如何激发–隐式线程A首先会把自己本地内存中修改后的x值刷新到主内存中此时主内存中的x值变为了1。随后线程B到主内存中去读取线程A更新后的x值此时线程B的本地内存的x值也变为了1。 
从整体来看这两个步骤实质上是线程A在向线程B发送消息而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互来为java程序员提供内存可见性保证。 
JMM的三大特性 
Java内存模型是围绕着并发编程中原子性、可见性、有序性这三个特征来建立的那我们依次看一下这三个特征 
原子性Atomicity 
一个操作不能被打断要么全部执行完毕要么不执行。在这点上有点类似于事务操作要么全部执行成功要么回退到执行该操作之前的状态。 
基本类型数据的访问大都是原子操作long 和double类型的变量是64位但是在32位JVM中32位的JVM会将64位数据的读写操作分为2次32位的读写操作来进行这就导致了long、double类型的变量在32位虚拟机中是非原子操作数据有可能会被破坏也就意味着多个线程在并发访问的时候是线程非安全的。 
可见性 一个线程对共享变量做了修改之后其他的线程立即能够看到感知到该变量的这种修改变化。 Java内存模型是通过将在工作内存中的变量修改后的值同步到主内存在读取变量前从主内存刷新最新值到工作内存中这种依赖主内存的方式来实现可见性的。 有序性 JMM中的八种内存操作 为了支持 JMMJava 定义了8种原子操作用来控制主存与工作内存之间的交互 read 读取作用于主内存将共享变量从主内存传送到线程的工作内存中。  load 载入作用于工作内存把 read 读取的值放到工作内存中的副本变量中。  store 存储作用于工作内存把工作内存中的变量传送到主内存中。  write 写入作用于主内存把从工作内存中 store 传送过来的值写到主内存的变量中。  use 使用作用于工作内存把工作内存的值传递给执行引擎当虚拟机遇到一个需要使用这个变量的指令时就会执行这个动作。  assign 赋值作用于工作内存把执行引擎获取到的值赋值给工作内存中的变量当虚拟机栈遇到给变量赋值的指令时就执行此操作。  lock锁定 作用于主内存把变量标记为线程独占状态。  unlock解锁 作用于主内存它将释放独占状态。