Unsafe 使用

来源:互联网 发布:平湖市行知小学足球 编辑:程序博客网 时间:2024/06/05 00:53

如果大家看过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());    }}
原创粉丝点击