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
Lock Condition
最新推荐文章于 2022-02-08 10:49:26 发布