闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时。这扇门才会打开并容许全部线程通过。它能够使一个或多个线程等待一组事件发生。

闭锁状态包含一个计数器。初始化为一个正式,正数表示须要等待的事件数量。

countDown方法递减计数器。表示一个事件已经发生,而await方法等待计数器到达0。表示等待的事件已经发生。

CountDownLatch强调的是一个线程(或多个)须要等待另外的n个线程干完某件事情之后才干继续运行。

场景应用
10个运动员准备赛跑,他们等待裁判一声令下就開始同一时候跑,当最后一个人通过终点的时候,比赛结束。

10个运动相当于10个线程,这里关键是控制10个线程同一时候跑起来,还有怎么推断最后一个线程到达终点。能够用2个闭锁,第一个闭锁用来控制10个线程等待裁判的命令,第二个闭锁控制比赛结束。

package concurrent.thread;
import java.util.concurrent.CountDownLatch;
class Racer implements Runnable{
private CountDownLatch start;
private CountDownLatch finish;
private int number;
public Racer(int number, CountDownLatch start, CountDownLatch finish){
this.start = start;
this.finish = finish;
this.number = number;
}
@Override
public void run() {
try {
System.out.println(number + "th racer ready!");
//等待起跑的命令
//注意这里不是用wait()
start.await();
System.out.println(number + "th racer finish!");
//跑完
finish.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException{
final int num = 10;
CountDownLatch start = new CountDownLatch(1);//这里最好用CyclicBarrier
CountDownLatch finish = new CountDownLatch(num);
for(int i = 1; i <= num; i++){
new Thread(new Racer(i, start, finish)).start();;
}
//等待一秒。防止线程没准备好就開始运行
//假设用CyclicBarrier。这里就不用等待了
Thread.sleep(1000);
System.out.println("比赛開始");
//比赛開始
start.countDown();
//等待比赛结束
finish.await();
System.out.println("比赛结束");
}
}

输出:
1th racer ready!
5th racer ready!
4th racer ready!
3th racer ready!
2th racer ready!
9th racer ready!
8th racer ready!
6th racer ready!
10th racer ready!
7th racer ready!
比赛開始
1th racer finish!
3th racer finish!
6th racer finish!
8th racer finish!
2th racer finish!
9th racer finish!
4th racer finish!
5th racer finish!
7th racer finish!
10th racer finish!
比赛结束

Java并发编程之闭锁CountDownLatch简单介绍的更多相关文章

  1. 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  2. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo

    Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...

  3. Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...

  4. Java并发编程之闭锁与栅栏

    一.前言 闭锁与栅栏是在多线程编程中的概念,因为在多线程中,我们不能控制线程的执行状态,所以给线程加锁,让其按照我们的想法有秩序的执行. 闭锁 CountDownLatch,实例化时需要传入一个int ...

  5. Java并发编程(三)概念介绍

    在构建稳健的并发程序时,必须正确使用线程和锁.但是这终归只是一些机制.要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问. 对 ...

  6. Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束

    Java 5 开始引入的 Concurrent 并发软件包里面的 CountDownLatch 其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是 ...

  7. Java并发编程笔记之 CountDownLatch闭锁的源码分析

    JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountD ...

  8. Java并发编程之闭锁简介

    闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过.它可以使一个或多个线程等待一组事件发生.闭锁状态包括一个计数器 ...

  9. java并发编程之二--CountDownLatch的使用

    CountDownLatch类 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助. CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行.使用一个 ...

随机推荐

  1. Active MQ C#实现

    原文链接: Active MQ C#实现 内容概要 主要以源码的形式介绍如何用C#实现同Active MQ 的通讯.本文假设你已经正确安装JDK1.6.x,了解Active MQ并有一定的编程基础. ...

  2. 2015-12-27 socket的用法

    sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) sk.bind(address) s.bind(address) 将套接字绑定到地址.a ...

  3. Amazon Hiring Campus 2013 - Final 6

    Let's assume that there is a simple market for beans. Every day there is a published bean price in t ...

  4. 转:seajs的spm使用摸索

    ~~~spm是基于nodejs的,打开nodejs命令行工具,npm install spm -g 进行spm的安装,过程很漫长 github上的官网不能访问 seajs自带的spm打包工具相关文档略 ...

  5. known good die( KGD) /确认好裸芯片,合格芯片

    英文:known good die( KGD) / 中文:确认好裸芯片,合格芯片 完工的晶圆上有许多晶片存在,其单一品质有好有坏,经过老化试验后,其确知电性能良好的晶片即称为己知好晶片.不过,已知好晶 ...

  6. use utf8

    [root@wx03 0724]# cat a2.pl use Encode; my $a=<STDIN>; my $b=encode_utf8('微信'); print "\$ ...

  7. 破解企业QQ对个人QQ登陆的限制(原创)

    运行系统:WIN7 破解时间:2014-02-19 破解思路:自从2013-11-11的1.85版企业qq更新后,网上流传的破解方法(运行文件BeatQQEIM.bat)已经不起作用了,可以同时登陆, ...

  8. 为了肾六(dp)

    为了肾六 时间限制:4000 ms  |  内存限制:210535 KB 难度:2   描述 最近肾六很流行,goshawk看身边的朋友都用上了apple.自己还用着W年前的Samsung.于是决定去 ...

  9. Unity3D游戏开发之小地图的实现

    今天我们来讲一下在Unity3D中怎样实现小地图.首先,我们来一起看看终于实现的效果: 要实现小地图效果,须要实现对于小地图和角色的绘制,所以这里须要用到OnGUI()方法,我们一起来看代码: [cs ...

  10. socket.io+angular.js+express.js做个聊天应用(四)

    接着上一篇 使用angularjs构建聊天室的client <!doctype html> <html ng-app="justChatting"> < ...