码迷,mamicode.com
首页 > 编程语言 > 详细

Java内存模型

时间:2019-05-16 12:28:39      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:导致   width   操作   sig   问题   虚拟   http   回写   str   

高速缓存:为了平衡计算机的存储设备与处理器的运算速度之间几个数量级的差距,引入一层高速缓存(Cache)来作为内存与处理器之间的缓冲。

缓存一致性(Cache Coherence)的问题:每个处理器都有自己的高速缓存,而它们又共享同一主内存(Main Memory),当多个处理器的运算任务都涉及同一块主内存区域时,就可能导致各自的缓存数据不一致。解决办法就是需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作。

技术图片

 

同理,为了屏蔽各种硬件和操作系统的内存访问差异,Java内存模型(Java Memory Model,JMM)如下:技术图片

 

  • 主内存(Main Memory):所有变量的存储位置。直接对应于物理硬件的内存。
  • 工作内存(Working Memory):虚拟机可能会让工作内存优先存储于寄存器和高速缓存中。
  • 交互协议:
    • 8种操作:锁定(lock)、解锁(unlock)、读取(read)、载入(load)、使用(use)、赋值(assign)、存储(store)、写入(write)***read操作读取变量到线程以便随后load,load操作将工作读取的变量载入内存的变量副本中;store对应read,write对应load
    • 不允许readloadstorewrite操作之一单独出现,即不允许一个变量从主内存读取了但工作内存不接受,或者从工作内存发起回写了但主内存不接受的情况出现。
    • 不允许一个线程丢弃它的最近的assign操作,即变量在工作内存中改变了之后必须把该变化同步回主内存。
    • 不允许一个线程无原因地,即没有发生过任何assign操作就把数据从线程的工作内存同步回主内存中。
    • 一个新的变量只能在主内存中“诞生”,不允许在工作内存中直接使用一个未被初始化(loadassign)的变量,即对一个变量实施usestore操作之前必须先执行过了assignload操作。

Java内存模型

标签:导致   width   操作   sig   问题   虚拟   http   回写   str   

原文地址:https://www.cnblogs.com/qionglouyuyu/p/10874636.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!