一.CountDownLatch介绍

CountDownLatch是JDK1.5之后引入的,存在于java.util.concurrent包下,能够使一个线程等待其他线程完成动作后再执行。
构造方法:
  public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}

主要方法:

countDown()方法每调用一次,计数器减1

await()方法使当前线程处于阻塞状态,知道计数器值为0

二.CountDownLatch使用

 package com;

 import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger; /**
* CountDownLatch测试
*/
class myThread<T> extends Thread {
CountDownLatch countDownLatch;
Map map;
//构造函数,传入的是Map
public myThread(CountDownLatch countDownLatch, Map map) {
this.countDownLatch = countDownLatch;
this.map = map;
}
public void run() {
map.put(Thread.currentThread().getName(),new Object());
countDownLatch.countDown();//线程执行一次就countDown计数器减少1
}
} public class TestThreadAndCollection {
public static void main(String[] args) throws InterruptedException {
//表示测试100次
for (int i = 0; i < 100; i++) {
test();
}
} public static void test() throws InterruptedException {
CountDownLatch latch = new CountDownLatch(2000);
//使用HashMap,这是线程不安全的
Map<String ,Object> hashMap = new HashMap();
//使用ConcurrentHashMap,线程安全的
//Map<String ,Object> concurrentHashMap = new ConcurrentHashMap();
//两个for循环,2000个线程
for (int i = 0; i < 1000; i++) {
//多线程HashMap测试
//myThread mThread = new myThread(latch, hashMap);
//多线程concurrentHashMap测试
myThread mThread = new myThread(latch, hashMap);
mThread.start();
}
for (int i = 0; i < 1000; i++) {
myThread mThread = new myThread(latch, hashMap);
mThread.start();
}
//等待当前所有子线程执行完,这里也就是使main线程处于等待状态,完了后再输出大小
latch.await();
//这里是main线程sleep一段时间(1秒),效果同latch.await();
/* try{
System.out.println(Thread.currentThread().getName());//当前线程输出的是main
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}*/
//System.out.println(concurrentHashMap.size());
System.out.println(hashMap.size());
}
}

因为多线程下HashMap是不安全的,所以结果:

而ConcurrentHashMap是线程安全的,结果如下图:

ConcurrentHashMap下,如果把CountDownLatch latch = new CountDownLatch(2000);中参数2000改成小于2000的值(1000)那么输出的结果如下:

因为countDown()计数器递减为0的时候,await()方法就不会再阻塞main线程,所以输出语句的执行可能会在所有线程put完成之前,因此结果不是2000

最新文章

  1. photoshop学习目录
  2. 【Android测试】【随笔】Android Studio环境搭建
  3. 纯代码自定义不等高cell
  4. Missing letters
  5. 实验12:Problem F: 求平均年龄
  6. mongo快速翻页方法(转载)
  7. bzoj1109
  8. llnq SqlMethods like
  9. Erlang分布式在linux和windows上的注意事项
  10. Linux fork操作之后发生了什么?又会共享什么呢?
  11. php+mysql+pdo连接数据库
  12. Nginx的HTTP模块
  13. ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件
  14. 《Windows驱动开发技术详解》之驱动程序的同步处理
  15. 确认oracle数据库错误日志文件位置
  16. Ubuntu 终端关机和重启命令
  17. 利用GSEA对基因表达数据做富集分析
  18. 记录学习WeakReference发现的问题
  19. windows 自带winmm.dll播放音频问题
  20. redis删除单个key和多个key,ssdb会落地导致重启redis无法清除缓存

热门文章

  1. ChIP-seq实战 | 染色质免疫共沉淀技术 | ATAC-seq | 染色质开放性测序技术
  2. 单细胞文献分析 Quantitative single-cell rna-seq with unique molecular identifers
  3. WCF利用Stream上传大文件
  4. vue 基础(二)
  5. 如何在mmseg3添加词库
  6. python基础之 反射,md5加密 以及isinstance, type, issubclass内置方法的运用
  7. Music in Car CodeForces - 746F (贪心,模拟)
  8. iptables -F 与 -X 区别
  9. [java]转:String Date Calendar之间的转换
  10. Web App和Native App的比较