本文主要是介绍JAVA学习——基于AQS的共享式锁CountDownLatch解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
笔者最近在解析基于AQS的ReentrantLock实现,ReentrantLock是可重入的独占锁,今天解析一下juc包中的共享锁CountDownLatch实现,仅当笔记。
CountDownLatch是一种共享锁,区别于独占锁,共享锁在某一个时刻可能有多个线程同时访问共享资源,当指定的线程都完成操作后,CountDownLatch才允许后续的操作继续进行。就好像百米赛跑,只有所有选手都跑完全程,裁判才能记录选手成绩,在此之前,裁判只能等待。
CountDownLatch与ReentrantLock一样,都是基于AQS实现,AQS基本原理此处不再赘述,想了解的读者请看我的另一篇文章,本文只解析CountDownLatch的内容。
CountDownLatch的接口如下,
CountDownLatch在初始化时,会设置共享资源数目,该数目一旦设置,无其他接口能进行更改。线程同步时最主要使用的为await和countDown方法,需要等待其他线程完成共享资源访问的线程会调用await方法,将自身阻塞,而被等待的线程在完成自身的功能操作后,会调用countDown方法,将共享资源减1,当共享资源为0时,所有调用await的线程都将被唤醒,继续后续代码。
在具体实现上,CountDownLatch使用了AQS的基本框架,下图以countDown和await两个主要方法为例,解析了具体的调用流程。
在实现CountDownLatch时,需要实现的方法为tryReleaseShared和tryAcquireShared方法。两个方法分别表示线程完成共享资源访问的具体操作和判断等待线程是否可以被唤醒。由于访问的共享资源被设置为AQS的state值,所有两个函数实际上就是对state值的判断和加减。具体代码实现如下:
//共享式锁需要实现的AQS的方法,AQS只提供了throw的默认实现@Overrideprotected int tryAcquireShared(int arg) {return (getState()
这篇关于JAVA学习——基于AQS的共享式锁CountDownLatch解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!