并发编程-Condition

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2020-11-30 07:27 被阅读0次

上一篇 <<<AQS同步器
下一篇 >>>CountDownLatch同步计数器


Condition用法

Condition底层也是基于AQS实现的。
Condition是一个接口,其提供的就两个核心方法,await和signal方法。分别对应着Object的wait和notify方法。调用Object对象的这两个方法,需要在同步代码块里面,即必须先获取到锁才能执行这两个方法。同理,Condition调用这两个方法,也必须先获取到锁

Condition的队列

a.等待队列:用于存放在lock锁中调用await方法,当前线程会变为阻塞状态,
同时会释放锁 单向链表存放
b.同步队列:用于存放没有竞争到锁,采用双向链表存放。

关键代码

public final void await() throws InterruptedException {
    if (Thread.interrupted())
        throw new InterruptedException();
// 将当前节点添加到最后一个节点
    Node node = addConditionWaiter();
//释放锁的状态
    long savedState = fullyRelease(node);
    int interruptMode = 0;
    while (!isOnSyncQueue(node)) {
// 如果当前线程为-2 则当前线程变为阻塞状态
        LockSupport.park(this);
        if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
            break;
    }
//重新获取锁
    if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
        interruptMode = REINTERRUPT;
    if (node.nextWaiter != null) // clean up if cancelled
        unlinkCancelledWaiters();
    if (interruptMode != 0)
        reportInterruptAfterWait(interruptMode);
}
public final void signal() {
    if (!isHeldExclusively())
        throw new IllegalMonitorStateException();
//获取单向链表,
    Node first = firstWaiter;
    if (first != null)
        doSignal(first);
}

相关文章链接:
多线程基础
线程安全与解决方案
锁的深入化
锁的优化
Java内存模型(JMM)
Volatile解决JMM的可见性问题
Volatile的伪共享和重排序
CAS无锁模式及ABA问题
Synchronized锁
Lock锁
AQS同步器
CountDownLatch同步计数器
Semaphore信号量
CyclicBarrier屏障
线程池
并发队列
Callable与Future模式
Fork/Join框架
Threadlocal
Disruptor框架
如何优化多线程总结

相关文章

网友评论

    本文标题:并发编程-Condition

    本文链接:https://www.haomeiwen.com/subject/lbchwktx.html