说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Java内存模型的历史变迁

HTML文档下载 WORD文档下载 PDF文档下载
本文通过介绍Java的新/旧内存模型,来展示Java技术的历史变迁。

本文通过介绍Java的新/旧内存模型,来展示Java技术的历史变迁。

旧的Java内存模型

Java使用的是共享内存的并发模型,在线程之间共享变量。Java语言定义了线程模型规范,通过内存模型控制线程与变量的交互,从而实现Java线程之间的通信。在JDK5之前,Java一直使用的是旧内存模型。如图1所示。变量保存在由所有线程共享的主内存中,主内存中的变量称为mastingcopy。每个线程都有一个工作内存,它保存变量的workingcopy。旧的内存模型定义了若干规则,通过这些规则来保证线程何时将主内存中的mastingcopy传送到线程的工作内存中;以及线程何时将工作内存中的workingcopy传送回主内存。旧内存模型使用8个操作来定义线程可以执行的动作。

  • read(读)操作:主内存把mastingcopy传送到线程的工作内存,以供后面的load操作使用。
  • load(装载)操作:线程将由read操作从主内存传送过来的值,放入工作内存中。
  • use(使用)操作:线程将变量的workingcopy传送到线程执行引擎。
  • assign(赋值)操作:线程将变量值从线程执行引擎传送到线程的工作内存中。
  • store(存储)操作:线程将变量的workingcopy传送到主内存,供后面的write操作使用。
  • write(写)操作:主内存将由store操作传送过来的值,放入主内存中。
  • lock(锁定)操作:线程获得指定对象的锁。
  • unlock(解锁)操作:线程释放指定对象的锁。


图1 Java旧内存模型

这里的关键是,由于read操作是由主内存执行,而对应的load是由线程执行,read操作和load操作之间是松散耦合的。也就是说,主内存和线程工作内存之间的变量传递是松散耦合的。同样,由于store操作是由线程执行,而对应的write是由主内存执行,store操作和write操作之间是松散耦合的。也就是说,线程工作内存和主内存之间的变量传递是松散耦合的。旧Java内存模型对Java实现如何执行变量的读/写,加锁/解锁,以及volatile变量的读/写,定义了非常严格的规则。这些规则非常复杂,具体详情请参考《JVM规范》,这里就不赘述了。旧Java内存模型通过这些复杂的规则,来保证多线程程序的线程之间,可以可靠地传递共享变量,从而保证多线程程序的正确性。

新的Java内存模型

从JDK5开始,Java使用新的内存模型,新内存模型完全抛弃了旧内存模型的主内存和工作内存的概念,也抛弃了旧内存模型的8个内存操作。也就是说,新内存模型完全是重新设计的。

新内存模型引入了一个新的概念,叫happens-before。happens-before的概念最初由LeslieLamport在其一篇影响深远的论文(《Time,ClocksandtheOrderingofEventsinaDistributedSystem》)中提出。LeslieLamport使用happens-before来定义分布式系统中,事件之间的一个偏序关系(partialordering)。LeslieLamport在这篇论文中给出了一个分布式算法,该算法可以将该偏序关系扩展为某种全序关系。

JSR-133使用happens-before的概念来指定两个操作(这里的操作是指程序中对变量的读/写,对锁的加锁和解锁)之间的执行顺序。新内存模型定义了如下的happens-before规则。

  • 程序顺序规则:一个线程中的每个操作,happensbefore于该线程中的任意后续操作。
  • 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
  • volatile变量规则:对一个volatile域的写,happensbefore于任意后续对这个volatile域的读。
  • 传递性:如果Ahappens-beforeB,且BhappensbeforeC,那么Ahappens-beforeC。
  • start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happensbefore于线程B中的任意操作。
  • join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。

由于两个操作可以在一个线程之内,也可以是在不同线程之间。因此JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happens-before关系,尽管a操作和b操作在不同的线程中执行,但JMM


图2新内存模型的设计示意图

向程序员保证a操作将对b操作可见)。在新内存模型向程序员提供happens-before规则,程序员只需要与happens-before打交道即可,因此Java程序员的学习负担大大降低。同时,新内存模型允许不会改变程序结果的重排序,这可以最大限度地放松对编译器和处理器的束缚,新内存模型的执行性能比旧内存模型要好。

作者简介:程晓明Java软件工程师,关注并发与NIO,《深入理解Java内存模型》的作者。现就职于南京富士通南大软件技术有限公司,从事富士通Interstage应用服务器的开发。


本文选自程序员电子版2015年5月B刊,该期更多文章请查看这里。2000年创刊至今所有文章目录请查看程序员封面秀。欢迎订阅程序员电子版(含iPad版、Android版、PDF版)。

开源SMTP和POP3邮件服务器 三星:在专利上不会和苹果妥协 不止谷歌,微软也有自己的眼镜计划?! Windows 8商店应用总数突破20000大关 硝烟弥漫:三星起诉苹果最新iPad、iPod侵权 效仿Google Facebook欲整合Instagram用户数据 与苹果全面竞争?传微软明年推Xbox机顶盒 微软Ralph Haupter:WP8即将在中国上市 开发者黄金时代来临 Paul Graham:Y Combinator创始人成长轨迹 我们需要强密码吗? 为了改变?英特尔CEO宣布将于明年5月辞职 传苹果下一代Mac OS中将整合Siri及地图服务 TripAdvisor:使用AWS比服务器托管成本节省50% [MDCC精华]亚马逊AWS布道师Kingsley Wood:灵活IT架构之道 亚马逊诉讼彰显谷歌在公有云领域威慑力十足 AWS全球创业大赛 奖金100000美元 YY:破冰而出,成功上市 Xtreme Labs工程师:Android开发常陷入的五大深坑 Elon Musk:没了乔布斯的苹果干不过谷歌 旁门左道:第一次开发移动游戏就赚到28623美元 移动周报:小聪明赚大钱 游戏SEO如何耍鸡贼? 创翼全国 六城联动——2012移动互联网应用创新大赛开放日 全国六城联动沙龙 爱丽丝+福尔摩斯 Game Insight解谜游戏玩出新花样 Windows Phone 8 SDK大升级:部分功能兼容WP7 信息大图《愤怒的小鸟》发家史 Intel预测:10年之后你的手机是48核的 消息推送惹怒用户:应用开发者请别太过分 创新工场:我们如何孵化未来? iOS越狱比例下降:国内移动开发环境怎么了? 响应式图像技术与资源分享 看Twitter如何应对大选:少些Ruby 多些Java 请问,如何在一个标签中加入其他的控件,并且控制标签显示的位置? 通过 2 个输入框 动态调整大小 ,但是不起作用 ?不是 后端 设置属性 会覆盖前端的吗 ? 写的第一首旧体诗,呵呵~ 学asp.net后再学asp快吗? ifaq, please come in. for you 求教问题!着急!asp.net如何连接SQLserver 十万火急:使用Directshow从摄像头读入数据,全屏播放时速度很慢 如何接受ActiveX控件的事件参数 关于MM和程序 求书 请问一个关于struts的问题,多谢了 求好书 请高手们指点一下!!!! 如何将tomcat8080端口改成8090? 急问:如何判断串口是否有设备接入? 请教:如何用win2k server和win2k pro进行局域网内的域建设 关于ltoa这个函数的一个小问题! 能将PB里数据窗口的报表以传真的方式发送出去吗?高分酬谢1 jb9里不能编辑MIDlet的代码吗? 在ASP中能够实现ASP.NET中的web.config其中的一个功能吗? 哈夫曼最优树 你能读懂吗? 关于借钱的问题,好烦恼呀,各位给点建议 求助,(datagrid+adodc) datagrid第一行第一列数据自动清除! 最近碰到一怪事~applet在某些机子上不能正常显示,help~~~~ 大家看看要编这样一个网站要多少钱? 思归大侠等高手,关于在javascript中调用并传值给服务器端方法的问题 有没有解决失眠的好办法? 有在广州天河软件园工作的朋友吗?请帮忙! 求助 再问一个sql语句 win2000下怎么控制用户上INTERNET? 一个关于WINFAX的问题!请教各位! dynamic_cast<TFileListBox*>(Source)!=0;这句什么意思? IE 问题 如何判断文件已经打开或被选中,如何将选中的文件解除选定 十万火急:direct3D中加入视频动画后,窗口显示不正确 如何在TextBox 中插入换行符 问一个小小的问题可以吗? IntraWEB中怎样连接带密码的Paradox数据据 SQL2000数据库建立了连接了,怎么还出现这种情况 紧急求救!! 请教:做了个按关键字搜索的小引擎,我想把搜索到的结果中包含“关键字”的部分以不同的颜色显示,就象google那样,请教策略 关于动态生成一个int[]数组 dbgrid中如果不给TColumn付FieldName,怎样给该列的单元格付值?谢谢! 为提高自己的实践水平,免费用JAVA给大家做程序 送大分啊。快来啊。 在线等待救助,请教大师oracle817安装的 问题 为提高自己的实践水平,免费用JAVA给大家做程序 请问如何禁止用户使用 Print Screen SysRq 键? 我想用Javascript达到这种效果,请问该怎么做? 可夫用英文怎么拼?“可夫”用英文怎么拼? 铨 这个字右面全没有中间那个横读什么 80C51单片机控制,用P1口控制8个灯单灯循环亮0.5s灭0.5s 编程 把一个数在数轴上表示的步骤是什么 c51用c定时器怎么用t0、t1定时0.2s、1.2s、0.5s? 把一个数在数轴上表示的步骤是什么? T1=Tem+T0;若小扰动使P1↑,则T1↑,△T>0,△T>0,表示什么哦 不会是一元二次方程里边的那个德尔塔吧! 更不止于野心矣 和 贤于才人远矣 的于意思相同吗 《狼》久之,目似瞑 和 《狼子野心》犬阻之,不是前也 之的意思是? 乃伪睡以俟 和 《狼》意将隧入以攻其后也 的以意思相同吗 乃杀之而取 湖水是什么意思? 湖水到底是什么意思?为什么叫湖水? 湖水文是什么意思? 黎巴嫩拒绝叙利亚化学武器进入其领土伦敦股市《金融时报》100种股票平均王正伟访问巴基斯坦德国法兰克福股市DAX指数29日上涨厄瓜多尔欲向斯诺登提供政治避难粮食主产区财政紧张陷怪圈:产粮越多经英国将发行伊斯兰债券 吸引中东投资者美国1名店员遭劫匪枪击 胸前手机挡下英国将发行伊斯兰债券 吸引中东投资者“今日中国 中国电影周”于曼谷开幕法国巴黎CAC40股指29日上涨乡村生活 城里滋味1000名残困少年儿童获福彩公益资助弘扬传统美德树立时代新风江苏建湖住建局“搂抱小姐”干部中俄军演实兵演练成功举行催眠师真的有那么神奇吗?乘客发病,杭州地铁被拉停杭州发布生活品质总点评十大现象因检举犯罪线索被暂停执行6个云服务外包项目签约瑞安 菜农抱团闯市场狼之牙魔校之凌风噬血真祖我的变身女神游戏神武英雄警花的大师保镖遥仙无上天人无敌邪少箫郧写作资料网游之定鼎三国韩城城隍庙旅游平遥漆器艺术博物馆旅游平遥国际摄影博物馆旅游大同煤矿展览馆旅游五龙壁旅游怀来紫晶庄园旅游八达岭森林公园旅游弘法寺旅游金沙湾海滨度假区旅游立志书院旅游月老庙旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘