前言
最近有点忙,上月也没有更新,以后补上。
平常资源搜索和看一些代码中,总是会发现一些好用却不常用的API,这里就当一个博客系列来分享一下,可能会断断续续,但会一直持续。
正题
简介
今天要分享的是CountDownLatch。
在使用这个API之前,我们经常使用synchronized,wait和Lock之类来保证线程同步,synchronized使用起来没啥问题。但在同一个区域块中使用保证线程同步,则会多使用wait和lock,使用它们的时候就要注意同一对象、try catch和在synchronized(obj) {…}中执行,用起来不太顺心。但使用了CountDownLatch,就会发现事情都变的简单了。
CountDownLatch用法
例子:
CountDownLatch countDownLatch = new CountDownLatch(1);
HttpBaseDownload.getDownloadUrl(url.toStringUrl(), address -> {
imgUrl = address;
countDownLatch.countDown();
});
try {
countDownLatch.await();
} catch (Exception e) {
e.printStackTrace();
}
这里使用了CountDownLatch,利用countDownLatch.await()将当前线程锁住,再使用countDownLatch.countDown()将线程释放。
注意
这里需要注意的是new CountDownLatch(1):
正常情况下只要1就可以满足使用了
在1的情况下,await调用一次进入锁状态,countDown调用一次就释放锁。
如果数量为0,当前锁无效,不管await调用几次,都锁不住。
如果数量为n,大于1,则调用一次await,需要调用n次countDown,才能解锁。
顾名思义,CountDown即限定down的次数。