为了账号安全,请及时绑定邮箱和手机立即绑定

Java内存模型

Java内存模型

nickzym 2017-07-27 00:06:08
Java内存模型允许JVM将没有被volatile修饰的64位数据类型的读写操作划分为两次32位的读写来进行为什么不是直接读64位 而是读32位?  这与什么有关?
查看完整描述

3 回答

已采纳
?
yeehom

TA贡献2条经验 获得超4个赞

主要和java虚拟机有关。


现在使用的大多都是32位虚拟机一次最多只能处理32位数据


使用64位虚拟机即可直接读写64位数据,但是64位虚拟机存在性能优势小和内存空间浪费等问题,目前尚未被广泛应用。

查看完整回答
1 反对 回复 2017-07-29
?
是王小二呀

TA贡献88条经验 获得超19个赞

了解过class文件结构吗?class文件中保存了譬如常量池、字段表、方发表、属性表等等,其字节码offset从0x00000000到0xFFFFFFFF一共2^32个,方法表里面有个code属性,其中有个叫max_locals的值代表局部变量表需要的存储空间,它的单位是slot,虚拟机规定了的为局部变量表分配的最小存储单位,不超过32位的如Int、byte等用一个slot,但long和double这种需要两个slot,你要读写一个大于32位的变量,就需要读写两次,被volatile修饰之后,它把这个非原子操作的两次读写封装成一个原子操作,就好像跟int型一样其读写具有原子性,至于怎么封装的,那你得看一下源码,原理是这样,但现在商用虚拟机里面,你就认为long这些跟int这些一样,都具有原子性操作就行了,没必要深究。

查看完整回答
反对 回复 2017-07-31
?
nickzym

TA贡献1条经验 获得超0个赞

那如果是64位机  现在读32位的怎么办

查看完整回答
反对 回复 2017-07-30
  • yeehom
    yeehom
    64位虚拟机可直接处理32位数据
  • 3 回答
  • 0 关注
  • 1508 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信