@(JDK)[AtomicInteger]
Unsafe在创建实例的时候,不能仅仅通过new Unsafe()
或者Unsafe.getUnsafe()
来获取,因为Java会进行安全校验,只有信任的代码,才能够获取实例。
要达到上述对应的ClassLoader为空,只有通过BootStrapLoader来加载才可以。(可以通过bootclasspath
实现)
java -Xbootclasspath:/usr/jdk1.7.0/jre/lib/rt.jar:. com.mishadoff.magic.UnsafeClient
Unsafe里面有一个静态变量,theUnsafe,另一种方式就是通过反射来获取该实例。
private static final Unsafe theUnsafe;
可以使用allocateInstance
方法来绕过构造方法的调用。
可以通过Unsafe. compareAndSwap
方法来实现Lock-free数据结构。使用的时候一般都会采用while循环在等待(Spin Lock),以及volatile来对内存数据变更能及时反应出来,在JDK里面AtomicInteger
等应用到了。
可以通过unsafe.objectFieldOffset
来获取类的字段偏移,一般可以和Unsafe. compareAndSwap
结合来使用。
如:
在AtomicInteger里面,主要通过使用CAS和volatile来实现。
这两个方法,和上面的区别在于只会调用一次,那么就需要开发者考虑失败的情况。