Java Unsafe 类的使用
Unsafe 类的作用
Unsafe 类是 rt.jar 包中的类,它提供了原子级别的操作,它的方法都是 native
方法,通过 JNI 访问本地的 C++库。它的出现是为了解决在高并发下的数据同
步问题。synchronize 关键字修饰的代码块被加了独占锁,相同时间只能有一个
线程访问其中的内容,在高并发下这必然会导致大量线程挂起,从用户态转为
内核态,带来很大的消耗而且操作效率低下。CAS 算法的出现使得在不使用
synchronize “ ”这种 悲观锁 依然可以实现数据的安全访问,CAS 算法是指先读取
要修改的变量值,对它进行计算,然后执行检查并更新这个步骤(更新前判断
那个值是否是之前那个读到的值),检查并更新是个原子操作,它由硬件来保
证可靠性,CAS 算法的最后一步的方法就是 Unsafe 类的方法。因此,Unsafe
类的方法可以说是 Java 高并发的各种扩展类的基础,他们的底层都是调用
Unsafe 类的方法,Unsafe 类为各种扩展类提供底层的原子操作。
Unsafe 类的加载和使用
Unsafe 类是 rt.jar 包中的类,rt 包是通过顶层的类加载器 Bootstrap 类加载器加
载的。如果不是在 Bootstrap 类加载器加载的类中试图加载这个类,JVM 就会报
错。比如我尝试在自己创建的 TestUnsafe 类中用 Unsafe 使用 getUnsafe()方法
获取实例,就会报错。如果一定要使用它,需要使用万能的反射机制。代码如
下:
public class TestUnsafe {
//获取 Unsafe 实例
static final Unsafe unsafe;
//记录 state 在类 TestUsafe 中的偏移值
static final long stateOffset;
//变量
public volatile long result=0;
public int[] arr={1,2,3,4,5,6};
static{
评论0
最新资源