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

posted @ 2023-05-16 15:39  r1-12king  阅读(49)  评论(0编辑  收藏  举报