CountDownLatch

 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能

CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作
  之前,它允许一个或多个线程一直等待

闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活
  动直到其他活动都完成才继续执行:
     确保某个计算在其需要的所有资源都被初始化之后才继续执行;
     确保某个服务在其依赖的所有其他服务都已经启动之后才启动;
     等待直到某个操作所有参与者都准备就绪再继续执行

闭锁:

在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才继续执行

案例:测试线程执行的时间

public class TestCountDownLatch {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch();
LatchDemo ld = new LatchDemo(latch); //计算执行时间
long start = System.currentTimeMillis();
for(int i=;i<;i++){
new Thread(ld).start();
} long end = System.currentTimeMillis();
System.out.println("线程执行的时间为:" + (start -end));
}
} class LatchDemo implements Runnable{ private CountDownLatch countDownLatch; public LatchDemo(CountDownLatch latch){
this.countDownLatch = latch;
} @Override
public void run() { for(int i= ;i<;i++){
if(i%==){
System.out.println(i);
}
}
}
}

此时无法得到10个子线程的执行时间

因为在子线程执行完成之前main函数的线程已经执行完毕

此时我们需要设置main函数线程在10个子线程执行完毕之后再执行

进行修改设置:

public class TestCountDownLatch {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch();
LatchDemo ld = new LatchDemo(latch); //计算执行时间
long start = System.currentTimeMillis();
for(int i=;i<;i++){
new Thread(ld).start();
} try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("线程执行的时间为:" + (start -end));
} } class LatchDemo implements Runnable{ private CountDownLatch countDownLatch; public LatchDemo(CountDownLatch latch){
this.countDownLatch = latch;
} @Override
public void run() { synchronized(this){
try {
for(int i= 0;i<5000;i++){
if(i%2==0){
System.out.println(i);
}
}
} finally {
//递减1
countDownLatch.countDown();
}
}

}
}

main函数中有10个线程

所以需要设置10个闭锁

每个线程执行之后都需要将其的值进行减一

所以在线程中:

synchronized:此时可能出现同部数据的设置

使用CountDownLatch的countDown()方法将其值进行递减1

同时需要使用await()放法进行等待所有线程执行完成之后再执行之后的代码

所以会在最后进行打印10个线程消耗的时间:

4、JUC--CountDownLatch闭锁的更多相关文章

  1. juc并发工具类之CountDownLatch闭锁

    import java.util.concurrent.CountDownLatch; /** * 闭锁: 在进行某些运算时, 只有其他所有线程的运算全部完成,当前运算才继续执行(程序流中加了一道栅栏 ...

  2. CountDownLatch闭锁

    CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完 ...

  3. CopyOnWriteArrayList(写入并复制) & CountDownLatch(闭锁)

    ConcurrentHashMap: ①Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能.② ConcurrentHashMap 同步容器 ...

  4. 6. CountDownLatch 闭锁

    package com.gf.demo05; import java.util.concurrent.CountDownLatch; /** * CountDownLatch : 闭锁,在完成某些操作 ...

  5. 同步机制之--java之CountDownLatch闭锁

    CountDownLatch闭锁 1.类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数初始化 CountDownLatch.CountDown ...

  6. 【同步工具类】CountDownLatch闭锁任务同步

    [同步工具类]CountDownLatch闭锁任务同步 转载:https://www.cnblogs.com/yangchongxing/p/9214284.html 打过dota的同学都知道,多人一 ...

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

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

  8. CountDownLatch(闭锁)

    一.闭锁(Latch)    闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都 ...

  9. CountDownLatch——闭锁的实现之一

    CountDownLatch实际上是一种闭锁实现.闭锁:是一种同步工具类,可以延迟线程的进度知道其到达终止状态--<Java并发编程实战>.这个怎么解释呢?简单来说,就是有1个线程需要等待 ...

  10. CountDownLatch 闭锁、FutureTask、Semaphore信号量、Barrier栅栏

    同步工具类可以是任何一个对象.阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore).栅栏(Barrier).以及闭锁(Latch). 所有的同步工具类都包含一些特定的结构 ...

随机推荐

  1. [javaSE] 看知乎学习工厂模式

    factory的“本质”就是根据不同的输入创建出不同类型的对象. 引入factory的原因就是你需要根据不同的输入创建不同类型的对象. 简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无 ...

  2. 简明log4j配置教程

    先准备好log4j需要对应的开发包: apache-log4j-extras-1.2.17.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar 然后就是在项 ...

  3. (六)彻底理解synchronized

    1.sychronized简介 在学习知识之前,我们先来看一个现象 public class SynchronizedDemo implements Runnable { private static ...

  4. JFace TableViewer性能改善 -- 使用VirtualTable

    前一篇提到了SWT中的table的通过使用virtual table性能得到很大的改善,那么如果既存的工程中使用的是TableViewer来创建的表,也能改成virtual table吗? 答案是肯定 ...

  5. Oracle面试的基本题

    事务 事务的概念 事务就是对数据操作的一系列指令集合. 事务的四个特性 原子性 事务的操作要么全部成功,要么全部失败,如果有一个指令失败,那么事务回滚到初始状态. 一致性 事务的执行不能破坏数据的完整 ...

  6. Android Studio引用自定义的framework.jar包

    1.在app/libs/目录下添加framework.jar包. 2.打开build->Edit Libraries and Dependencies,把libs/framework.jar放到 ...

  7. Expo大作战(二十四)--expo sdk api之Accelerometer

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  8. 用sparkR, 分析上亿条订单数据的脚本。

    上周我们这个10人的小团队开发的推荐拉新系统, 日拉新人数已接近4万人.过去几个月这个系统从无到有, 拉新从日增几千稳步增长到日增几万, 同事们几个月来,每天工作13个小时以上,洗澡时间都没有, 有时 ...

  9. Windows安装PostgreSQL数据库 无法初始化数据库问题

    背景 由于项目的需要,使用PostgreSQL数据库,因此在Windows上安装PostgreSQL数据库.但是在安装后,无法访问本地数据库,这个时候查看/data目录,没有任何文件.而且安装过程中, ...

  10. 【SPL标准库专题(7)】 Datastructures:SplHeap & SplMaxHeap & SplMinHeap

    堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现.根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆.二叉堆还常用于排序(堆排序). 类摘 ...