前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CountDownLatch较Semaphore来说是简单了

CountDownLatch较Semaphore来说是简单了

作者头像
dhyuan
发布2022-05-30 14:18:31
2570
发布2022-05-30 14:18:31
举报
文章被收录于专栏:响应式编程

这篇是使用CountDownLatch和Semaphore后的一点体会。感觉前者比后者使用起来简单很多,CountDownLatch只有await和countDown两个较为关键方法。也就是说:

1) CountDownLatch初始化之后设置的计数值在被减到0之后就不能被复原了,而Semaphore可以通过release恢复信号/许可的数量,所以CountDownLatch能解决的问题范畴要小于Semaphore。在用到了semaphore.release这种操作的代码里,我们基本是没办法用CountDownLatch替换Semaphore来解决的。CountDownLatch就如一次性的门栓之于大门,门栓被拉开之后,大门的状态只能是‘开’了,我们没有能力再把门关起来。而Semaphore更像是信号灯,我们可以根据需要给出不同的‘红’、‘绿’(release)信号,因此适用的场景可以更复杂。

所以对于LeetCode多线程练习题,只有1114题可以用CountDownLatch来完成。

2) 另外,从允许、禁止这个方向上讲,Semaphore是信号/许可数量大于0时线程可运行(semapher.acquire不阻塞),对于CoundDownLatch来说则是计数值等于0时线程可运行(countDownLatch.await不阻塞)。

用CountDownLatch完成LeetCode 1114:

代码语言:javascript
复制
public class FooByCDL {

    private CountDownLatch cdl2 = new CountDownLatch(1);
    private CountDownLatch cdl3 = new CountDownLatch(1);
    public FooByCDL() {}

    public void first(Runnable printFirst) throws InterruptedException {
        printFirst.run();
        cdl2.countDown();
    }

    public void second(Runnable printSecond) throws InterruptedException {
        cdl2.await();
        printSecond.run();
        cdl3.countDown();
    }

    public void third(Runnable printThird) throws InterruptedException {
        cdl3.await();
        printThird.run();
    }

    public static void main(String[] args) {
        FooByCDL foo = new FooByCDL();

        new Thread(() -> {
            try {
                foo.third(() -> System.out.print("three"));
            } catch (InterruptedException ie) { ie.printStackTrace();}
        }).start();

        new Thread(() -> {
            try {
                foo.second(() -> System.out.print("two"));
            } catch (InterruptedException ie) { ie.printStackTrace();}
        }).start();

        new Thread(() -> {
            try {
                foo.first(() -> System.out.print("one"));
            } catch (InterruptedException ie) { ie.printStackTrace();}
        }).start();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 响应式编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档