暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

java线程同步利器之CountDownLatch

磊哥谈技术 2018-11-04
362

       为了提高系统的性能,多线程编程已经在java编程中盛行。当并发出现后,线程同步问题,已然成为程序员们需要考虑的问题。

       曾记否,操作系统考试的时候,永远少不了的是PV操作题目。而PV操作正是控制进程同步的一种机制。

       java开发包java.util.concurrent中同样存在一个用于同步控制的类,CountDownLatch。这个类的功能非常类似于PV操作中的P操作。

       我们通过开源项目druid对CountDownLatch的使用,来理解一下这个类的用途。

      DruidDataSource类中定义了一个实例变量 initedLatch,该变量即为 CountDownLatch 类型。通过变量对象的创建,我们可以看到构造方法中传了数值2作为参数。定义代码如下:

private final CountDownLatch initedLatch=new CountDownLatch(2);

       通过后面对initedLatch的使用,我们来分析一下,参数为什么传的是2,而不是其他值。

       后面对initedLatch的使用,调用了CountDownLatch 的两个方法,分别是await()和countDown(),await()方法的调用,发生在DruidDataSource的初始化方法init()中。

initedLatch.await();
init = true;

       通过语义,我们知道init()方法调用initedLatch的await()方法,是为了等待某些任务完成,从而看出此处使用了线程同步等待。我们继续查找,发现对initedLatch的countDown()方法调用,分别发生在守护线程CreateConnectionThread和DestroyConnectionThread中,

public CreateConnectionThread(String name){
super(name);
   this
.setDaemon(true);
}

public void run() {
initedLatch.countDown();


public DestroyConnectionThread(String name){
super(name);
   this
.setDaemon(true);
}

public void run() {
initedLatch.countDown();

        而调用initedLatch的await()方法之前,同时启动了守护线程CreateConnectionThread和DestroyConnectionThread用于connection的动态创建及动态销毁。

createAndStartCreatorThread();
createAndStartDestroyThread();

initedLatch.await();
init = true;


       通过分析,我们知道initedLatch构造时为什么参数传2了,也明白了CountDownLatch是如何控制线程同步的。

       CountDownLatch构造方法中的参数,指定了计数值,countDown()方法每调用一次,就会使计数值减一,await()方法引起线程等待,直到initedLatch的计数值减为0时,才继续执行,从而达到了线程同步的效果。

文章转载自磊哥谈技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论