网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
可签
7
级以上的吧
50
个
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月28日
漏签
0
天
芽筑说吧
关注:
94
贴子:
1,861
看贴
图片
吧主推荐
游戏
13
回复贴,共
1
页
<返回芽筑说吧
>0< 加载中...
Java内存模型应该如何理解
只看楼主
收藏
回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
送TA礼物
1楼
2018-08-22 09:30
回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
所有的编程语言中都有内存模型这个概念,区别于微架构的内存模型,高级语言的内存模型包括了编译器和微架构两部分。我试图了解了Java、C#和Go语言的内存模型,发现内容基本大同小异,只是这些语言在具体实现的时候略有不同。
2楼
2018-08-22 09:30
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我们在线程运行的时候有一个内存专用的一小块内存,当Java程序会将变量同步到线程所在的内存,这时候会操作工作内存中的变量,而线程 中变量的值何时同步回主内存是不可预期的。但同时Java内存模型又告诉我们通过使用关键词“synchronized”或“volatile”可以让 Java保证某些约束:
3楼
2018-08-22 09:31
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
volatile” — 保证读写的都是主内存的变量
“synchronized” — 保证在块开始时都同步主内存的值到工作内存,而块结束时将变量同步回主内存
4楼
2018-08-22 09:31
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
通过以上描述我们就可以写出线程安全的Java程序,JDK也同时帮我们屏蔽了很多底层的东西。
但当你深入了解JVM的时候你会发现根本就没有工作内存这个东西,即内存中根本不会分配这么一块空间来运行你的Java程序,那么工作内存到底是什么东西呢?
5楼
2018-08-22 09:31
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这个问题也曾经困扰了我很长时间,因为我从来没有从JVM的实现中找到过和主内存同步的代码,因为当使用“volatile”时我仅仅能从源代码中调用了这行语句:
__asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory");
6楼
2018-08-22 09:31
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
而这个指令在部分微架构上的主要功能就是防止指令重排,即这条指令前后的其它指令不会越过这个界限执行[注1]。
在现在的x86/x64微架构中读写内存的一致性都是通过MESI(Intel使用MESI-F,AMD使用MOESI)协议保证[注2]
7楼
2018-08-22 09:32
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
那Java内存模型中所说的工作内存是什么呢?
我的理解是,首先“工作内存”是一个虚拟的概念,而承载这个概念主要是两部分:
1. 编译器
2. 微架构
8楼
2018-08-22 09:32
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
对于微架构来说,在x86/x64下,CPU会在执行指令时做指令重排,即编译器生成的指令顺序和真正在CPU执行的顺序可能是不一致的。当我们用一个变量做信号的时候这种指令重排会带来悲剧,即如果有如下代码
10楼
2018-08-22 09:33
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
x = 0;
y = 0;
i = 0;
j = 0;
// thread A
y = 1;
x = 1;
// thread B
i = x;
j = y;
11楼
2018-08-22 09:33
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
代码i和j的值是:“00, 01, 10, 11”都是有可能的。
对于这种情况,如果我们想得到确定的结果则需要通过“synchronized”(或者j.c.u.locks)来做线程间同步。
12楼
2018-08-22 09:33
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我个人对Java内存模型的理解是:在编译器各种优化及多种类型的微架构平台上,Java语言规范制定者试图创建一个虚拟的概念并传递到 Java程序员,让他们能够在这个虚拟的概念上写出线程安全的程序来,而编译器实现者会根据Java语言规范中的各种约束在不同的平台上达到Java程序 员所需要的线程安全这个目的
13楼
2018-08-22 09:33
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
关于“lock”前缀的详细说明可以查看这个文档《Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide, Part 1》的 这个章节“CHAPTER 8 MULTIPLE-PROCESSOR MANAGEMENT”。
14楼
2018-08-22 09:33
回复
收起回复
爷们就是牛
铁杆吧友
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
不同的微架构的内存模型都会有一些差别,本文中都是指x86/x64
15楼
2018-08-22 09:34
回复
收起回复
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧热议榜
1
2024贴吧年度盘点
2261760
2
特朗普要求暂停TikTok强制出售令
1670864
3
C罗炮轰金球奖不公平
1500632
4
美媒称中国新型战机令人震惊
1176714
5
YSKM爆料S15新赛制
1084408
6
曝徐娇被起诉
1058650
7
崩铁3.1新角色缇宝公布
836184
8
韩媒曝Zeus军训被霸凌
661043
9
徐娇为《雄狮少年》怼素人
553300
10
《清明上河图密码》豆瓣7分
510174
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示