猿问

Java内存模型

Java内存模型允许JVM将没有被volatile修饰的64位数据类型的读写操作划分为两次32位的读写来进行

为什么不是直接读64位 而是读32位?  这与什么有关?


nickzym
浏览 1507回答 3
3回答

yeehom

主要和java虚拟机有关。现在使用的大多都是32位虚拟机,一次最多只能处理32位数据。使用64位虚拟机即可直接读写64位数据,但是64位虚拟机存在性能优势小和内存空间浪费等问题,目前尚未被广泛应用。

是王小二呀

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

nickzym

那如果是64位机  现在读32位的怎么办
随时随地看视频慕课网APP

相关分类

Java
我要回答