标签:condition 可见 等待队列 设计模式 队列 双向 java ola 总结
首先我们来普及一下juc是什么:juc其实就是包的缩写(java.util.concurrnt)
我们可以发现lock包下有三个抽象的类:
通常地:AbstractQueuedSynchronizer简称为AQS
我们Lock之类的两个常见的锁都是基于它来实现的。
看源码总结出以下比较关键的信息:
上面也提到了AQS里边最重要的是状态和队列,我们接下来就看看其源码是怎么样的...
使用volatile修饰实现线程可见性:
修改state状态值时使用CAS算法来实现:
这个队列被称为:CLH队列(三个名字组成),是一个双向队列
获取独占锁的过程就是在acquire定义的,该方法用到了模板设计模式,由子类实现的
过程:acquire(int)尝试获取资源,如果获取失败,将线程插入等待队列。插入等待队列后,acquire(int)并没有放弃获取资源,而是根据前置节点状态状态判断是否应该继续获取资源,如果前置节点是头结点,继续尝试获取资源,如果前置节点是SIGNAL状态,就中断当前线程,否则继续尝试获取资源。直到当前线程被park()或者获取到资源,acquire(int)结束。
释放独占锁的过程就是在acquire定义的,该方法也用到了模板设计模式,由子类实现的
过程:首先调用子类的tryRelease()方法释放锁,然后唤醒后继节点,在唤醒的过程中,需要判断后继节点是否满足情况,如果后继节点不为且不是作废状态,则唤醒这个后继节点,否则从tail节点向前寻找合适的节点,如果找到,则唤醒。
标签:condition 可见 等待队列 设计模式 队列 双向 java ola 总结
原文地址:https://www.cnblogs.com/harpoonJava/p/13225238.html