Java内存模型允许JVM将没有被volatile修饰的64位数据类型的读写操作划分为两次32位的读写来进行为什么不是直接读64位 而是读32位? 这与什么有关?
3 回答
已采纳
yeehom
TA贡献2条经验 获得超4个赞
主要和java虚拟机有关。
现在使用的大多都是32位虚拟机,一次最多只能处理32位数据。
使用64位虚拟机即可直接读写64位数据,但是64位虚拟机存在性能优势小和内存空间浪费等问题,目前尚未被广泛应用。
是王小二呀
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这些一样,都具有原子性操作就行了,没必要深究。
添加回答
举报
0/150
提交
取消