谈到 JUC,Lock 接口,大家肯定都会用。最常用的 ReentrantReadWriteLock 等。本文作为 JUC 的开头,先把 Lock 接口和 AQS 的 API 说一下,然后说清楚 Lock 和 AQS 的关系。文章结构:
Lock 接口相关要实现 API:
AQS 相关要实现 API: AQS 提供给程序员调用的 API: AQS 提供的模板方法:好了,看了上面的 API,或者根本懒得看的 API,大家肯定是一脸 **,不过没关系,下面我通过一张图来说清楚 AQS(队列同步器) 和 Lock 接口的关系。
稍微说一下: 当我们要实现一个 Lock 接口的实现类时,是肯定要依赖一个 AQS(队列同步器的),这是为什么呢,因为队列同步器帮我们维护是线程阻塞和释放的逻辑,比如,线程竞争锁时,当一个线程没有竞争到时,要把它丢进一个 FIFO 的队列,当获取到锁的线程释放锁时,要通知在队列里的线程出来竞争。大家想一想,如果让你自己维护,那不是累死了??所以 JDK 给我们提供了 AQS,暴露出来了一些底层的 API,让我们去覆盖,然后有一些模板 API 来调用我们底层的 API,并且维护好队列。这样我们就只用把精力放在
获得到锁和没有获得到锁的逻辑上了. 不用管没有线程获得锁后以及线程释放锁后如何通知其他线程怎么维护。如图所示,红色箭头的起始点其实就是 AQS 提供给我们的
模板 API,我们要实现的 API 只需要调用 AQS 提供给我们的 state 相关 API(绿色箭头尾部) 来维护是否获取到锁就可以了。最后 Lock 接口的 API 调用模板方法或者我们实现的 API 来实现锁的语义.
注意点:
好了,打完收工。Hava a good day . 下期将自定义一个 Lock 来运用本文所讲的内容。
来源: https://juejin.im/post/5a3a09d9f265da4312810fb9