Java—多线程7 Lock2---深入理解AQS

本文详细解析了Java多线程中Lock的实现原理,重点讨论了AQS(AbstractQueuedSynchronizer)的独占式锁获取与释放过程。非公平锁的获取通过模板方法acquire(int arg),尝试使用CAS获取同步状态,失败则将线程加入同步队列。释放锁时,通过unparkSuccessor唤醒最近的等待线程以保证公平性。
摘要由CSDN通过智能技术生成

#Java—多线程7 Lock2—深入理解AQS

##独占锁的获取

非公平锁

1.模板方法aquire(int arg)

public final void acquire(int arg) {
   
    //调用tryAcquire再次尝试获取锁,如果成功直接退出
    //如果失败,首先调用addWaiter将钱财封装成结点入同步队列,
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}

**tryAcquire(arg)-------:**再次使用CAS尝试获取同步状态,若成功方法直接返回,当前线程置为持有锁状态,

如果失败,调用

addWaiter(Node.EXCLUSIVE), arg)————将当前线程封装成Node结点后尾插入同步队列

//Creates and enqueues node for current thread and given mode.
//将当前的线程封装成结点入队
private Node addWaiter(Node mode) {
   
    	//1.将当前线程以指定模式(独占式、共享式)封装成Node结点
        Node node = new Node(Thread.currentThread(), mode);
        // Try the fast path of enq; backup to full enq on failure
    	//2.拿到当前队列的尾结点
        Node pred = tail;
    	//当前队列不为空
        if (pred != null) {
   
            node.prev = pred;
            //将当前节点使用CAS尾插入同步队列
            if (compareAndSetTail(pred, node)) {
   
                pred.next = node;
                return node;
            }
        }
    	//当前队列为空或CAS尾插失败是调用enq
        enq(node);
        return node;
    }

mode:表示锁时什么模式,是独占式还是共享式。

enq()————当同步队列为空时,完成队列的初始化操作,以及不断CAS将当前节点未插入同步队列

private Node enq(final Node node) {
   
	//不断自旋	
    for (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值