Lock底层原理解析-AQS-CAS-02

上一篇文章我们温习了 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 的一些 问题和 实现原理后面再来分析。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容