从AQS学习CAS操作

在AQS中,可以看到使用了很多native方法去实现CAS操作。

下面分析一下,是如何实现折现线程安全的操作,首先需要用到Unsafe类,从名字就能看出来这是个 “不安全”的类,因为它提供了对底层内存的直接操作。

首先获取一个 Unsafe实例,然后获取类中字段的偏移量。

private static final Unsafe U = Unsafe.getUnsafe();
private static final long STATE
= U.objectFieldOffset(AbstractQueuedSynchronizer.class, "state");
private static final long HEAD
= U.objectFieldOffset(AbstractQueuedSynchronizer.class, "head");
private static final long TAIL
= U.objectFieldOffset(AbstractQueuedSynchronizer.class, "tail");

然后将对象实例,偏移量,以及expect值,和更新的值传入进到 Unsafe类提供的compareAndSetInt()中。

Unsafe便会调用native方法去原子性更新STATE指向的内存的值。

如果操作时的值等于传入的expect值那么原子性更新为update的值,返回true;如果不是说明已经发生了更新,那么便不会更新返回false;

protected final boolean compareAndSetState(int expect, int update) {
    return U.compareAndSetInt(this, STATE, expect, update);
}

public final native boolean compareAndSetInt(Object o, long offset,
                                             int expected,
                                             int x);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值