AQS如何基于无锁化的CAS机制实现高性能的加锁

1、测试类

lock.lock();

点击lock()进入如下代码

2、ReentrantLock类

public void lock() {
    sync.lock();
}

点击lock()进入如下代码

3、NonfairSync内部类

final void lock() {
    if (compareAndSetState(0, 1))
        setExclusiveOwnerThread(Thread.currentThread());
    else
        acquire(1);
}

分析:
1)AQS里有一个核心变量,state,代表了锁的状态。下面这行代码的意思,如果state是0(没人加锁),把这个state设置为1 (加锁),并返回true;否则加锁失败,返回false。

  if (compareAndSetState(0, 1)):

点击compareAndSetState(0, 1)进入如下代码
2)如果加锁成功,就需要设置一下自己是当前加锁的线程

setExclusiveOwnerThread(Thread.currentThread());

4、AbstractQueuedSynchronizer类

protected final boolean compareAndSetState(int expect, int update) {
    return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}

说明加锁的底层是基于Unsafe来实现,这个jdk内部使用的类,封装了一些指针操作,基于cpu指令实现原子性的CAS。

5、总结

1)加锁的原理,就是用CAS技术设置AQS的state变量,设置成功再设置exclusiveOwnerThread为当前加锁线程。
2)Lock API性能比较好,CAS无锁化,乐观锁的思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值