Unsafe类的学习之objectFieldOffset方法(一)

719 阅读3分钟

一、通过方法名称(对象字段的偏移量)可以得知,这是一个获取对象字段偏移量的方法。要想知道什么是偏移量我们首先得知道什么是偏移地址?通过百度百科,我们可以得知偏移地址就是计算机里的内存分段后,在段内某一地址相对于段首地址(段地址)的偏移量。 百度内容太过官方,所以我参考这篇文章做了一个解释。

8086/8088有20条地址线,它的直接寻址能力为1MB。也就是在一个系统中可以有多达1MB的存储器,地址从00000H—FFFFFH。上面的H字母表示十六进制数(Hex),那么00000H—FFFFFH 转化为10进制就是0~1048575。2^20=1048576(这就是上述说的1M)。但是8086/8088CPU只能进行16位运算,寻找操作数的范围最大是2^16,也就是64K。那么如何才能形成20位的物理地址呢

系统先将1MB存储器以64KB为范围分成若干段。在寻址一个具体物理地址时,由一个基本地址再加上由SP或IP等可由CPU处理的16位偏移量来形成20位物理地址。当系统需要产生一个20位地址的时候,一个段寄存器会自动被选择。且自动左移4位再与一个16位地址偏移量相加产生所需的20位地址(左移4位就是16进制后面补一个0)。

例如:
数据段DS寄存器的值=0088H
偏移地址=22H
那么生成的20位物理地址等于:00880H+22H=008A2H

二、那么拿到这个偏移量可以做什么呢?换句话说,为什么要获取偏移量?

可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的。
假如有个类C有成员变量a。获取a的偏移量加上C的基本地址就可以得到a在内存中存储的位置,就可以对它的值进行修改。偏移量对于 给定的成员变量而言是唯一的。 CAS相关的方法都需要偏移量作为参数定位判断内存中的值。

三、总结
偏移量相当于是一个相对定位,对于给定的字段是唯一的,通过基本地址与偏移量可以精准定位在内存中的物理位置,可以对其进行修改。objectFieldOffset是获取一个对象成员变量的偏移量的方法,通常CAS会用到。

注:以上内容均为网络收集加上编者自己的理解,如有不对的地方,欢迎大家指正,共同成长。