Lock Condition

Condition:
    include await, awaitUninterruptibly, awaitNanos, awaitUntil, signal, signalAll,  correspond to Object wait, notify, notifyAll, but more flex, U can have more control

invoke condition.await means current thread must have the lock or will throw IllegalMonitorStateException, when invoke condition.await, current thread will release lock

Condition.await:
当持有lock的thread调用condition.await 时, 首先会创建Node节点 赋予ConditionObject的 lastWaiter 并返回, 然后去释放lock 锁, 也就是 Lock state 设置为0(可能重入多次, state >1, 后面accquireQueued会恢复state), 判断condition node
是否在同步等待队列中(判断依据isOnSyncQueue), 如果不在则park当前线程, 让condition node 进入同步等待队列的方法有1通过signal 2 condition node所在线程interrupt, 当condition node进入同步等待队列后就会参与对锁的竞争, 获锁成功后根据
interrupt的状态做对应的处理(抛出异常, 重置中断标志, 或者不处理), 如果不抛出异常则进行后面的自己业务, 最后lock.unlock. 进入condition的节点最终一定会进入同步等待队列, 最终会获取锁.

Condition.signal:
thread调用Condition.signal, 主要获取ConditionObject firstWaiter node, doSignal从condition firstWaiter开始尝试enq(Node firstWaiter)参与锁的竞争, 如果compareAndSet(waitStatus, CONDITION, 0)失败则选择next, 失败的原因为
waitStatus 已经改变, 因为在await()方法中如果interrupt 则会enq, waitStatus 已经变为0. 在await() 中 while (!isOnSyncQueue(node))可以继续执行(也可以通过thread.interrupt 提前enq() 线程或throw InterruptException)

Lock可以interrupt 的主要原因是 LockSupport.park 会导致interrupted 的线程 unblock 同时不会throw Exception

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值