为了提高系统的性能,多线程编程已经在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时,才继续执行,从而达到了线程同步的效果。




