1.总览
Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。
2.具体介绍
2.1 内存操作
2.1.1 内存分配
long allocateMemory(long bytes)
long reallocateMemory(long address, long bytes)
重新分配内存。void freeMemory(long address)
2.1.2 内存存取
void putType(long address, T data)
T getType(long address)
其中T可以是:boolean、byte、char、short、int、long、float、double、Object。
2.1.3 操作对象字段值
void putType(Object o, long offset, T data)
T getType(Object o, long offset)
和2.1.1中的方法对比,这套方法的内存地址定位不是直接使用address,而是使用Object+Field offset的方式。于此对应还有一套结合了volatile语义的方法,来保证可见性。
void putTypeVolatile(Object o, long offset, T data)
T getTypeVolatile(Object o, long offset)
2.1.4 存取指针
long getAddress(long var1)
void putAddress(long var1, long var3)
对一个给定的内存地址获取或设置一个本地指针
2.2 CAS
boolean compareAndSwapObject(Object o, long offset, Object expected, Object update)
boolean compareAndSwapInt(Object o, long offset, int expected,int update)
boolean compareAndSwapLong(Object o, long offset, long expected, long update)
2.3 线程调度
void unpark(Object thread)
void park(boolean isAbsolute, long time)
park & unpark 在底层依赖的是每个java线程关联的park结构(由虚拟机维护)来实现。void monitorEnter(Object o)
void monitorExit(Object o)
boolean tryMonitorEnter(Object o)
这三个方法已标记为@Deprecated
,操作的是java中每个对象关联的对象锁(monitor),Synchronize关键字就是依赖的这个monitor。
2.4 内存屏障
void loadFence()
禁止load操作重排序。屏障前的store操作不能被重排序到屏障后,屏障后的store操作不能被重排序到屏障前void storeFence()
禁止store操作重排序。屏障前的store操作不能被重排序到屏障后,屏障后的store操作不能被重排序到屏障前void storeFence()
禁止load和store操作重排序
2.5 系统
int addressSize()
int pageSize()
int getLoadAverage(double[] loadavg, int nelems)
2.6 待总结:
public native void setMemory(Object var1, long var2, long var4, byte var6);
public native void copyMemory(Object var1, long var2, Object var4, long var5, long var7);
public native long staticFieldOffset(Field var1);
public native long objectFieldOffset(Field var1);
public native Object staticFieldBase(Field var1);
public native boolean shouldBeInitialized(Class<?> var1);
public native void ensureClassInitialized(Class<?> var1);
public native int arrayBaseOffset(Class<?> var1);
public native int arrayIndexScale(Class<?> var1);
public native Class<?> defineClass(String var1, byte[] var2, int var3, int var4, ClassLoader var5, ProtectionDomain var6);
public native Class<?> defineAnonymousClass(Class<?> var1, byte[] var2, Object[] var3);
public native Object allocateInstance(Class<?> var1) throws InstantiationException;
public native void throwException(Throwable var1);
public native void putOrderedObject(Object var1, long var2, Object var4);
public native void putOrderedInt(Object var1, long var2, int var4);
public native void putOrderedLong(Object var1, long var2, long var4);