CountDownLatch 同步工具类、递减锁、闭锁
名字有多个。可是实际指的都是CountDownLatch,看一不同名字的解释
CountDownLatch 同步工具类: 多用来完成同步的功能,例如有一个任务需要两个工人完成,两个工人现在手头都有工作,并分别先后完成了手头的工作,先完成工作的人需要等待后完成工作的人一起来完成这个任务。
CountDownLatch 递减锁: CountDownLatch内部是通过定义一个数,每执行完一个工作这个数减一,直到为0认为完成全部工作,所以也叫递减锁
CountDownLatch 闭锁: CountDownLatch的await()方法就像一个关闭的门,所有人完成工作都需要到门这里等待,直到最后一个人完成工作,门才会打开,大家可以通过,不过这个方法是一次性不可逆的,门打开就不会再关上。当执行这个方法以后CountDownLatch对象也就相当于失效了。
#下面定义了三个类,分别为CountDownLatchDemo、Student、Teacher
初始化定义计数器的值为5、可以理解为有5个线程或者5个事情要做
CountDownLatch cdl = new CountDownLatch(5);
我们定义了5个线程,并且把CountDownLatch传递进去
new Thread(new Student(cdl)).start();
因为是线程。里面有run方法。我们调用线程的start方法执行里面的run方法,run方法里面会执行下方代码,把计数器减一
此方法为原子性方法,所以每次只会有一个人进行减一
cdl.countDown();
这里会阻塞代码,代码执行到这里会卡主。会一致等待之前定义的计数器5变成0才会放行
cdl.await();
当上方的5个进程都执行了cdl.countDown();方法,我们最开始定义的计数器为5,执行了5次减一,变成0 。cdl.await()会放行执行下方的输出语句
System.out.println(“考试开始~~~”);
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch cdl = new CountDownLatch(5);
new Thread(new Student(cdl)).start();
new Thread(new Student(cdl)).start();
new Thread(new Student(cdl)).start();
new Thread(new Student(cdl)).start();
new Thread(new Teacher(cdl)).start();
// 在计数归零之前,下面的线程应该是不能执行需要被阻塞
cdl.await();
// 主函数所在的类本身是一个独立的线程
System.out.println("考试开始~~~");
}
}
class Student implements Runnable {
private CountDownLatch cdl;
public Student(CountDownLatch cdl) {
this.cdl = cdl;
}
@Override
public void run() {
System.out.println("学生到达考场~~~");
// 计数数量减少1个
cdl.countDown();
}
}
class Teacher implements Runnable {
private CountDownLatch cdl;
public Teacher(CountDownLatch cdl) {
this.cdl = cdl;
}
@Override
public void run() {
System.out.println("老师到达考场~~~");
cdl.countDown();
}
}