上一篇文章我们温习了 AQS 中内部的数据结构,在分析AQS 之前,再来学习一下CAS
- CAS 案例使用
/**
* cas 简单 案例
*/
public class CASDemo {
// cas 实现 依赖
// Unsafe.Caused by: java.lang.SecurityException: Unsafe 直接调用会有异常,被认为是不安全的
// private static final Unsafe unsafe = Unsafe.getUnsafe();
private static Unsafe unsafe ;
static {
try {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
unsafe = (Unsafe)theUnsafe.get(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
private int status;
/**
* cas
* @param expect
* @param update
*/
public void compareAndSet (int expect, int update) throws NoSuchFieldException {
// 获取 status 在内存中的地址偏移量,简单理解可以是 内存地址值
long statusOffset = unsafe.objectFieldOffset(CASDemo.class.getDeclaredField("status"));
// 操作 对是 CASDemo
// 操作 属性 是 status (地址偏移量)
// 当前内存中 如果是 expect , 就将内存中的值 更新 为 update
unsafe.compareAndSwapInt(this,statusOffset, expect, update);
}
public static void main(String[] args) throws NoSuchFieldException {
CASDemo casDemo = new CASDemo();
casDemo.status = 0;
casDemo.compareAndSet(0,1);// 当 status 值为 0 的时候,将值更新为1
System.out.println(casDemo.status);
}
}
我们简单的学习了 CAS ,接下来就可以进入分析 AQS 的内容了。当然CAS 的一些 问题和 实现原理后面再来分析。
网友评论