Unsafe类如其名,该类不安全,我们在程序里不能直接调用
构造器
public static Unsafe getUnsafe() {
Class var0 = Reflection.getCallerClass();
if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
throw new SecurityException("Unsafe");
} else {
return theUnsafe;
}
}
限制了必须是使用固定的类加载器加载的类才能调用,我们可以实现,但是没必要直接调
个人把Unsafe类的方法分为两个部分
1)通过CAS实现线程安全的方法
2)park和unpark
第一个
通过CAS实现线程安全的方法
举个简单的例子
public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);
该方法通过true和false告知修改是否成功,实现线程安全
第二个
park和unpark
public native void unpark(Object var1);
public native void park(boolean var1, long var2);
park是线程自己把自己锁住,进行等待
unpark是唤起其他线程,传参一般是待唤起的线程