CountDownLatch同步工具类、递减锁、闭锁

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();
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值