unsafe类常见的方法
前言
Unsafe类提供了硬件级别的的原子性操作,Unsafe类中的方法都是native方法,通过使用JNI的方式访问本地C++库。
unsafe类在jdk源码中得到了非常广泛的应用,是理解jdk源码的基础,今天我们就来分享一下其中常见的方法。
1.compareAndSwapInt方法说明
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
该方法共有四个参数,方法主要实现的作用是:从var1对象的起始指针移动var2位,如果该位置上存储的值等于var4,那么将该值修改成var5。
- var1:比较的对象
- var2:指针偏移量
- var4:条件值
- var5:新值
除了这个方法,像Unsafe中的compareAndSwapObject、compareAndSwapLong方法都是类似的作用。
2.getObjectVolatile方法说明
public native Object getObjectVolatile(Object var1, long var2);
该方法又两个参数,该方法的主要作用是:获取当前对象var1在该对象指定偏移量var2上的值
- var1:待计算的对象
- var2:在对象上的偏移量
除了这个方法,像Unsafe中的getIntVolatile、getBooleanVolatile、getByteVolatile、getShortVolatile、getCharVolatile、getLongVolatile、getFloatVolatile、getDoubleVolatile等方法都是类似的作用。
3.putObject方法说明
public native void putObject(Object var1, long var2, Object var4);
该方法有三个参数,该方法的主要作用是:修改对象var1上偏移var2后位置上的值为var4。
- var1:待修改的对象
- var2:偏移量
- var4:新值
除了这个方法,像Unsafe中的putBoolean、putByte、putChar、putLong、putFloat、putDouble等方法都是类似的作用。
4.objectFieldOffset方法说明
public native long objectFieldOffset(Field var1);
该方法只有一个参数,类型为Field,该方法的主要作用是:获取当前对象var1字段在该对象的偏移量
- var1:对象中的字段
获得该偏移量之后就可以通过compareAndSwapInt这个方法,原子修改var1的值
5.getAndSetLong方法说明
long getAndSetLong(Object obj , long offset, long update)
方法: 获取对象 obj 中偏移量为offset 的变量 volatile语义的当前值 ,并设置变量 volatile 语义的值为 update
6.getAndAddLong方法说明
long getAndAddLong(Object obj, long offset, long addValue)
方法: 获取对象obj中偏移量为 offset 的变量 volatile 语义的当前值 ,并设置变量值为原始值+addValue