并发编程

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

2020-04-19  本文已影响0人  愤怒的奶牛

上一篇文章我们温习了 AQS 中内部的数据结构,在分析AQS 之前,再来学习一下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 的一些 问题和 实现原理后面再来分析。

上一篇 下一篇

猜你喜欢

热点阅读