Unsafe 类通过提供底层的内存操作和原子操作,允许开发者在高性能场景中绕过 Java 的一些限制,实现更高效的代码。然而,由于其操作的危险性和不安全性,必须谨慎使用。理解 Unsafe 类的实现原理,有助于深入理解 Java 并发和 JVM 的底层机制。
Unsafe 类是 Java 中一个非常特殊的类,它提供了一些底层操作的方法,可以绕过 Java 的安全检查机制直接操作内存和对象。尽管 Unsafe 类具有灵活性和性能优势,但由于其不安全性和平台依赖性,使用时需要谨慎,并且只在必要的情况下使用。 参考资料 [1] 首发博客地址:https://blog.zysicyj.top/ [2] 面试题手册:ht...
如下Unsafe源码所示,Unsafe类为一单例实现,提供静态方法getUnsafe获取Unsafe实例,当且仅当调用getUnsafe方法的类为引导类加载器所加载时才合法,否则抛出SecurityException异常。 publicfinalclassUnsafe{// 单例对象privatestaticfinalUnsafe theUnsafe;privateUnsafe(){ }@CallerSensitivepublicstaticUnsafegetUnsafe(){Classvar0...
可通过Java cmd命令的-Xbootclasspath/a参数把调用Unsafe方法的类所在jar包路径追加到默认的Bootstrap路径中,使得该类可被BootstrapClassLoader加载,从而获取Unsafe实例。 java -Xbootclasspath/a: ${path} // path为调用Unsafe方法的类所在jar包路径 2. 反射 Java反射机制能够动态生成对象和获取、调用任意类的静态...
Unsafe类的CAS操作可能是用的最多的,它为Java的锁机制提供了一种新的解决办法,比如AtomicInteger等类都是通过该方法来实现的。compareAndSwap方法是原子的,可以避免繁重的锁机制,提高代码效率。这是一种乐观锁,通常认为在大部分情况下不出现竞态条件,如果操作失败,会不断重试直到成功。
unsafe是JDK提供的一个工具类,里面的方法大多是native方法,unsafe类是JDK给你提供的一个直接调用操作系统底层功能的一个工具类,unsafe提供了非常多操作系统级别的方法。 (1)比如说通过unsafe可以让操作系统直接给你分配内存、释放内存。 (2)突破java语法本身的限制,直接从内存级别去操作堆里面的某个对象的数据; ...
实现原理 AtomicInteger的实现基于以下几个关键概念:Unsafe类:Unsafe类是Java中的一个底层类,提供了硬件...
由CAS分析AtomicInteger原理 java.util.concurrent.atomic 包下的原子操作类都是基于 CAS 实现的,下面拿 AtomicInteger 分析一下,首先是 AtomicInteger 类变量的定义: privatestaticfinalUnsafeunsafe=Unsafe.getUnsafe();privatestaticfinallongvalueOffset;static{try{valueOffset=unsafe.objectFieldOffset(AtomicInteger.class.get...
直接使用Unsafe还是有诸多不便之处,因此lock包提供了一个辅助类LockSupport封装了park和unpark 举个例子: 可以看出,使用LockSupport要比直接只用Unsafe更加便捷。 此外,LockSupport还可以用来给线程设置一个Blocker对象,便于调试和检测线程,其原理是使用Unsafe的putObject方法直接设置Thread对象的parkBlocker属性,并在合适的时候读...
return theUnsafe; } } 主要有两种方式来绕过安全检查,一种是通过将使用Unsafe的类交给bootstrap class loader去加载,另一种方式是通过反射。 1.1 通过bootstrap class loader去加载Unsafe。 publicclassGetUnsafeFromMethod{publicstaticvoidmain(String[] args){//调用这个方法,必须要在启动类加载器中获取,否则会抛出...