Java内存模型

来源:互联网 发布:卡密社区源码 编辑:程序博客网 时间:2024/06/16 04:13

由于CPU与存储器的运行速度差异的存在,需要引用高速缓存来解决。而引入高速缓存之后,又会带来缓存一致性的问题,即多个处理器有着自己的高速缓存,但却共用一个主存。

Java内存模型

在Java虚拟机中是怎么解决上述问题的?先用一个图来引用Java的内存模型:
Java内存模型
首先,对几个名词进行梳理:
主内存:Java内存模型中规定了所有的变量都必须存储在主内存中,可以类比硬件中的内存。
工作内存:每条线程都有自己独立(无法互相访问)的一个工作内存(可以类比高速缓存)工作内存中保存了对被该线程使用到的变量的主内存的副本,线程对变量的所有操作都必须在工作内存中进行,而不能直接读取主内存中的变量。

内存间交互操作

一个变量如何从主存拷贝到工作内存,如何从工作内存同步到主存中?Java内存模型中定义了一下八种操作:

  • lock:作用于主存的变量,把变量标识为线程独占的状态。
  • unlock:给变量释放锁,释放后该变量才能被 其他线程锁定。
  • read:把一个变量值从主存传输到工作内存。以便load操作。
  • load:将read得到的变量值载入到工作内存的变量副本中。
  • use:将工作内存中一个变量的值传输到执行引擎。
  • assign:把执行引擎收到的值赋值给工作内存中的变量。
  • store:与read相反,把工作内存中的变量值传输到主存中。
  • write:将store得到的变量值载入到主存的变量中。

需要注意的是read与load,store与write需要顺序的执行。当然,Java内存模型在执行上述操作时也有一些规定:

  • 不允许read和load,store和write单独出现。
  • 不允许一个线程丢弃它最近的assign操作。变量在工作内存改变了必须同步会主存中。
  • 不允许线程无原因地同步变量到主存中。
  • 执行use和store之前,必须先执行assign和load操作。
  • 一个变量在同一时刻只允许一个线程执行lock操作。一个线程可以执行多次lock操作,但是要执行相同次数的unlock操作才能解锁。
  • 如果对一个变量执行lock操作,工作内存中此变量的值会被清空。
  • 如果没有执行过lock操作,则不能执行unlock操作。
  • 对一个变量执行unlock操作前,必须通过store和write操作同步此变量到主存中。
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 并蹄莲叶子大黄怎么办 异地恋见面来大姨妈怎么办 奶水太多宝宝老是呛到怎么办 奶水太多吃奶婴儿呛怎么办 人家不愿意交我为朋友怎么办 面对诋毁我的人怎么办 做事太细致速度太慢怎么办 高一儿子早恋了怎么办 儿子18岁谈朋友怎么办 和朋友为钱吵架怎么办 感情里总担心失去怎么办 眼石移出盲僧怎么办 打仗把小便踢肿了怎么办 腿上都是挠的疤怎么办 脚上的肉烂了怎么办 商铺门口有电杆怎么办 漏电保护器坏了怎么办 空开进线烧了怎么办 过压保护灯亮怎么办 美的热水器接地异常怎么办 欠压保护器坏了怎么办 三孔插座没地线怎么办 二胡琴筒裂缝宽怎么办 有了月亮从四星宠满级的怎么办 党委下属没有党支部了党委怎么办 发生日期大于制单日期怎么办 美的空调出现p0怎么办 薯片受潮不脆了怎么办 泡过的莲子煮不烂怎么办 绿豆有煮不熟的怎么办 吃了羊肉吃西瓜怎么办 吃了狗肉和绿豆怎么办 做的衣柜没有门怎么办 蒸馒头熟了会瘪怎么办 3dmax贴图太大了怎么办 嘴皮边缘颜色深怎么办 嘴巴周围肤色暗沉怎么办 中奖彩票被洗了怎么办 牙龈下面长米粒肉疙瘩怎么办 书画印章盖反了怎么办 金龙鱼一个月不吃东西怎么办