Java并发编程:闭锁CountDownLatch之一起回家

一、CountDownLatch的特性

    CountDownLatch也叫闭锁它是一个同步工具类,它的一个特性是:闭锁相当于一道门,所有线程都没到达之前,都是关闭状态的。直到所有的线程都完成各自的任务后,闭锁就会打开,并且一直处于打开状态。举个常见的例子来说,同学聚会,我们需要等到所有的人都到了,聚会才能开始。

二、CountDownLatch实现原理

      CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成自己的任务后,计数器的值就会减一。当计数器值到达0时,它表示所有的线程已经完成了任务,然后再闭锁上等待的线程就可以恢复执行任务。

三、代码实现

例子:小明、小刚、小红、三个人打算放学后,约定一起回家。因此,我模拟了三个并行线程。

未使用闭锁的情况下:

public class CountDownLatchTest {


    public void run() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("小明到达了校园门口");
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("小红到达了校园门口");
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("小刚到达了校园门口");
            }
        }).start();

            System.out.println("三个都到了,然后一起回家!");

    }

    public static void main(String[] args){
        CountDownLatchTest test = new CountDownLatchTest();
        test.run();
    }

}

输出结果:

小红到达了校园门口
小明到达了校园门口
三个都到了,然后一起回家!
小刚到达了校园门口

通过上面的例子可以看出,结果乱套了。我们要的结果是三个人都到达门口这一个条件,方能继续下一个动作的执行。接下来使用闭锁的情况下:

public class CountDownLatchTest {
    private CountDownLatch latch = new CountDownLatch(3);


    public void run() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("小明到达了校园门口");
                latch.countDown();
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("小红到达了校园门口");
                latch.countDown();
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("小刚到达了校园门口");
                latch.countDown();
            }
        }).start();

        try {
            latch.await();
            System.out.println("三个都到了,然后一起回家!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args){
        CountDownLatchTest test = new CountDownLatchTest();
        test.run();
    }

}

输出结果:

小明到达了校园门口
小红到达了校园门口
小刚到达了校园门口
三个都到了,然后一起回家!

四、总结

     CountDownLatch类的构造函数中的计数值(count)实际上就是闭锁需要等待的线程数量,这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。其他的线程通过调用闭锁对象,即CountDownLatch的CountDown()方法,每调用之后,CountDownLatch构造函数里的count就会减1。当count为0时,表示其他线程任务已都完成,主线程就能通过await()方法,恢复执行自己的任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值