如果大家看过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());
}
}