JUC(二)-Condition源码详解-流程图超清晰

本文详细解析了JUC-AQS-Condition的工作原理,包括Condition的作用、数据结构及核心源码解读,如await()和signal()方法。通过实战代码示例,展示了线程在等待和唤醒过程中的状态变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


如果直接看这个有难度,大家可以看下基础的AQS详解 JUC(一)-AQS源码分析

一、Condition的作用

二、Condition的数据结构

在这里插入图片描述

三、核心源码解读

3.1 await()

在这里插入图片描述

public final void await() throws InterruptedException {
   
            if (Thread.interrupted())
                throw new InterruptedException();
            Node node = addConditionWaiter();
            //放弃所有持有的锁
            int savedState = fullyRelease(node);
            int interruptMode = 0;
            //阻塞判断,当前node是不是在同步队列时,不在同步队列那么就park当前线程
            while (!isOnSyncQueue(node)) {
   
                LockSupport.park(this);
                //如果被中断了,则检测中断
                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
                    break;
            }
            //这是此节点已经在同步队列中了
            //在队列中获取锁,并判断当前的interruptMode不为-1,即不是抛出异常
            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
                //把中断类型设置为,重新中断,意味在线程获得锁的时候,重新中断线程
                interruptMode = REINTERRUPT;
            if (node.nextWaiter != null) // clean up if cancelled
                unlinkCancelledWaiters();
            if (interruptMode != 0)
                reportInterruptAfterWait(interruptMode);
        }

1.先判断当前线程的中断状态,如果为中断则抛出异常
2.如果不是中断状态,则把当前节点加入Condition队列中,即我们的等待队列中
3.释放当前持有的锁,并记住当前state的值
4.会阻塞在判断当前节点是否在同步队列中,只有当执行了signal(),节点才会被添加回到同步队列中,如果不在队列中,则park当前线程
5.如果在同步队列中,则尝试从队列中获得锁
6.获得锁之后,需要响应不同的中断模式

 /**
  * 判断是否要抛出中断异常
  */
        private void reportInterruptAfterWait(int interruptMode)
            throws InterruptedException 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值