Java并发基础(11)—— AbstractQueuedSynchronizer

本文深入解析Java并发基础中的AbstractQueuedSynchronizer(AQS)独占锁获取源码,包括tryAcquire、addWaiter和acquireQueued方法。分析了线程在获取锁过程中的节点加入、状态检查、自旋等待等关键步骤,以及在自旋过程中如何处理中断和节点状态变化。
摘要由CSDN通过智能技术生成

一、独占锁获取源码

在上节中,我们学习了AQS的基本概念,并手动实现了一个独占锁,以及相应的数据结构:节点和同步队列

接下来我们来看一下独占锁的源码

当我们采用独占式获取时,我们在lock方法中调用其模板方法acquire

public void lock() {
		//子类覆盖的是流程方法tryAcquire,这里调用父类的模板方法acquire
		sync.acquire(1);//模板方法
	}

我们来看一下acquire模板方法

public final void acquire(int arg) {
        if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();//该方法就是执行Thread.currentThread().interrupt();
}

tryAcquire方法: 尝试获取锁

addWaiter方法:把Node节点加入同步队列中,参数Node.EXCLUSIVE是独占锁,Node.SHARED 是共享锁

acquireQueued方法:一旦加入同步队列,就需要使用该方法,自旋阻塞唤醒来不断的尝试获取锁,直到被中断或获取到锁,这里需要看源码加深理解

1.1 tryAcquire方法

我们自己实现的流程方法,通过CAS方式设置同步标志位,设置成功表示拿到锁

protected boolean tryAcquire(int arg) {
            assert arg == 1;
            //cas将状态从0设为1,如何不为0则失败
            if(compareAndSetState(0,1)){
                return true;
       
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值