CountDownLatch在多线程程序中的应用
一.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
CountDownLatch在多线程程序中的应用的更多相关文章
- zz剖析为什么在多核多线程程序中要慎用volatile关键字?
[摘要]编译器保证volatile自己的读写有序,但由于optimization和多线程可以和非volatile读写interleave,也就是不原子,也就是没有用.C++11 supposed会支持 ...
- 多线程程序中fork导致的一些问题
最近项目中,在使用多线程和多进程时,遇到了些问题. 问题描述:在多线程程序中fork出一个新进程,发现新的进程无法正常工作. 解决办法:将开线程的代码放在fork以后.也就是放在新的子进程中进行创建. ...
- Linux -- 在多线程程序中避免False Sharing
1.什么是false sharing 在对称多处理器(SMP)系统中,每个处理器均有属于自己的本地高速缓存区. 如图,CPU0和CPU1有各自的本地高速缓存区(cache).线程0和线程1会用到不同的 ...
- gdb常用命令及使用gdb调试多进程多线程程序
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...
- 《Java大学教程》—第22章 多线程程序
22.2 进程(process):P551时间切片(time-slicing):处理器只是完成了一个任务的一部分工作,然后完成下一个任务的一部分工作,因为处理吕每次完成工作的时间都非常短,因此看起来这 ...
- Linux下多线程编程中信号量介绍及简单使用
在Linux中有两种方法用于处理线程同步:信号量和互斥量. 线程的信号量是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作.如果一个程序中有多个线程试图改变一个信号量的值,系统将保 ...
- C# 多线程程序隐患
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 在 java 程序中怎么保证多线程的运行安全?(未完成)
在 java 程序中怎么保证多线程的运行安全?(未完成)
- java程序中的多线程(转)
为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 ― 打印机.磁盘.数据库和显示屏 -- 由于硬 ...
随机推荐
- Flex scroller皮肤的使用
Flex4 scroller 自定义皮肤 十月 15, 2010 Posted by admin flex4里引入了sparkSkin, spark包里的可视控件可以通过指定skinClass的值来修 ...
- 大div中嵌套小div,点击大div时隐藏,点击小div不隐藏
给小div添加一个click事件 <div onClick="event.cancelBubble = true"> //小div
- yii框架中使用gii的用法
首先在config文件中的 main-local.php中添加一句 'allowedIPs' => ['*'],如下图所示:
- php算法,冒泡排序
冒泡排序 /*** *从小到大排列 * 逻辑分析 假设数组 $arr=[a,b,c,d]; * 总数=4; * 比较对象 第几个元素 比较次数 * a 1 3 * b 2 2 * c 3 1 **/ ...
- CentOS7 安装Nginx 1.14:
nginx-1.14.2.tar.gz:下载:wget http://nginx.org/download/nginx-1.14.2.tar.gz 安装nginx: yum install ...
- Python Signal 信号
https://blog.csdn.net/kongxx/article/details/50976802 http://blog.itpub.net/7728585/viewspace-214206 ...
- uva-11324-SCC+dp
https://vjudge.net/problem/UVA-11324 给出一幅有向图,问最大能找到多少个节点,使得这些节点中任意两个节点之间都至少有一条可达路径. 找出SCC后缩点求权重最大路即可 ...
- Zookeeper浏览器工具和Eclipse插件
公司很多产品会使用zookeeper,比如Meta消息中间件,在测试的过程中,我们经常需要查询zookeeper里面的信息来精确定位问题.目前项目中有开发团队自己写的浏览器node-zk-browse ...
- 大数据分析引擎Apache Flink
Apache Flink是一个高效.分布式.基于Java实现的通用大数据分析引擎,它具有分布式 MapReduce一类平台的高效性.灵活性和扩展性以及并行数据库查询优化方案,它支持批量和基于流的数据分 ...
- 如何把一个杯子卖到上万元,不学你就OUT了
我们可以看看一个产品卖到多少钱需要占有什么样的资源: 第1种卖法:卖产品本身的使用价值,只能卖3元/个 如果你将他仅仅当一只普通的杯子,放在普通的商店,用普通的销售方法,也许它最多只能卖3元钱,还可能 ...