Unsafe 使用

如果大家看过jdk 源码,那么都应该对Unsafe类有点印象
至于这个类可以用来干什么这里不讨论,主要研究下怎么样使用
这个类常规的方法是不能创建改的

类1:数据封装

public class Data {
    private int num;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

}

类2:工具获取Unsafe

import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;

import sun.misc.Unsafe;

public class Util {
    private static final Unsafe THE_UNSAFE;

    static {
        try {
            final PrivilegedExceptionAction<Unsafe> action = new PrivilegedExceptionAction<Unsafe>() {
                public Unsafe run() throws Exception {
                    Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
                    theUnsafe.setAccessible(true);
                    return (Unsafe) theUnsafe.get(null);
                }
            };

            THE_UNSAFE = AccessController.doPrivileged(action);
        } catch (Exception e) {
            throw new RuntimeException("Unable to load unsafe", e);
        }
    }

    public static Unsafe getUnsafe() {
        return THE_UNSAFE;
    }
}

类3:main


import sun.misc.Unsafe;

public class UnsafeTest {
    public static void main(String[] args) throws NoSuchFieldException, SecurityException {
        Data data = new Data();
        data.setNum(1);
        Unsafe unsafe = Util.getUnsafe();
        long num = unsafe.objectFieldOffset(Data.class.getDeclaredField("num"));
        unsafe.compareAndSwapInt(data, num, 1, 10);
        System.out.println(data.getNum());

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值