unsafe类

JDK 的此jar包中 的 Unsafe 类提供了硬件级别的原子性操作 ,Unsafe 类中的方法都是native 方法 ,它们使用JNI的方式访问本地 C++实现库。

使用unsafe类 完成copareAndSwap

/**
 * @author ggBall
 * @version 1.0.0
 * @ClassName UnsafeSateTest.java
 * @Description 获取不到unsafe app类加载器加载不到 unsafe 因为unsafe只允许bootstrap类加载器获取,Unsafe.getUnsafe()里面也做了判断只允许bootstrap类加载器加载
 * @createTime 2022年04月30日 16:44:00
 */
public class UnsafeSateTest {

    static final Unsafe unSafe = Unsafe.getUnsafe();

    static long stateOffset = 0;

    private volatile long state = 0;


    static {
        try {
            // 拿到 属性state在类UnsafeSateTest的偏移量
            stateOffset = unSafe.objectFieldOffset(UnsafeSateTest.class.getDeclaredField("state"));

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        UnsafeSateTest unsafeSateTest = new UnsafeSateTest();
        boolean result = unSafe.compareAndSwapLong(unsafeSateTest, stateOffset, 0, 1);
        System.out.println("result = " + result);
    }


}

/**
 * @author ggBall
 * @version 1.0.0
 * @ClassName UnsafeSateTest.java
 * @Description 利用反射获取unsafe
 * @createTime 2022年04月30日 16:44:00
 */
public class UnsafeSateTest2 {

    static Unsafe unSafe;

    static long stateOffset = 0;

    private volatile long state = 0;


    static {
        try {

            Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
            theUnsafe.setAccessible(true);

            // 获取该变量的值
            unSafe = (Unsafe)theUnsafe.get(null);

            // 拿到 属性state在类UnsafeSateTest的偏移量
            stateOffset = unSafe.objectFieldOffset(UnsafeSateTest2.class.getDeclaredField("state"));

        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        UnsafeSateTest2 unsafeSateTest = new UnsafeSateTest2();
        boolean result = unSafe.compareAndSwapLong(unsafeSateTest, stateOffset, 0, 1);
        System.out.println("result = " + result);
    }