首页 > 编程语言 > 详细

Java内存模型

时间:2019-06-17 09:25:03      阅读:137      评论:0      收藏:0      [点我收藏+]

一、上图

技术分享图片

二、Java内存模型的设计目的

1.屏蔽掉不同硬件、操作系统之间的内存访问差异,实现Java程序在各种平台下达到一致的内存访问效果(Java口号:write once,run anywhere)

2.定义程序中线程共享区域(堆、方法区)的变量访问规则(存在线程竞争问题)

 

三、内存交互指令以及使用限制

8个交互指令:

1.主内存变量操作指令:lock、unlock、read、write

2.线程工作内存变量操作指令:load、use、assign、store

使用限制:

1.read指令与load指令结合使用,store指令与write指令结合使用。不允许变量从主内存read后工作内存不load,以及从工作内存发起store后主内存不write

2.执行引擎assign变量副本后需立即store,store之后需立即write到变量,因此assign->store->write可列为一组顺序指令,执行引擎use变量之前要求从工作内存load变量,load之前要求从主内存read变量到工作内存副本,因此read->load->use可列为一组顺序指令

3.lock与unlock指令必须成对出现,且同一时刻只允许一条线程对一个变量进行lock操作,该线程可lock多次该变量,需要对应次unlock。当变量被lock后,需要清空全部工作内存中此变量副本的值,当执行引擎下一次使用该变量时,需执行read->load->use指令;变量执行unlock指令之前,必须先把变量同步回主内存中,需执行assign->store->write指令。

比如

3.1 synchronized测试:

技术分享图片

 

3.2 volatile测试:

技术分享图片

 注意:volatile只保证可见性,适用于单线程写值多线程读值场景

 

3.3 多线程写volatile变量测试 

 技术分享图片

将会得到错误的结果

技术分享图片

 

Java内存模型

原文:https://www.cnblogs.com/dengjianghua/p/11037737.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!