`
Ydoing
  • 浏览: 106202 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java并发编程之闭锁简介

 
阅读更多

闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过。它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,初始化为一个正式,正数表示需要等待的事件数量。countDown方法递减计数器,表示一个事件已经发生,而await方法等待计数器到达0,表示等待的事件已经发生。CountDownLatch强调的是一个线程(或多个)需要等待另外的n个线程干完某件事情之后才能继续执行。

场景应用
10个运动员准备赛跑,他们等待裁判一声令下就开始同时跑,当最后一个人通过终点的时候,比赛结束。10个运动相当于10个线程,这里关键是控制10个线程同时跑起来,还有怎么判断最后一个线程到达终点。可以用2个闭锁,第一个闭锁用来控制10个线程等待裁判的命令,第二个闭锁控制比赛结束。

    import java.util.concurrent.CountDownLatch;
    class Aworker implements Runnable {
    private int num;
    private CountDownLatch begin;
    private CountDownLatch end;
    public Aworker(int num, final CountDownLatch begin, final CountDownLatch end) {
    this.num = num;
    this.begin = begin;
    this.end = end;
    }
    @Override
    public void run() {
    // TODO Auto-generated method stub
    try {
    System.out.println(num + "th people is ready");
    begin.await();//准备就绪
    } catch (InterruptedException e) {
    e.printStackTrace();
    } finally {
    end.countDown();//计数器减一,到达终点
    System.out.println(num + "th people arrive");
    }
    }
    }
    public class Race {
    public static void main(String[] args) {
    int num = 10;
    CountDownLatch begin = new CountDownLatch(1);
    CountDownLatch end = new CountDownLatch(num);
    for (int i = 1; i <= num; i++) {
    new Thread(new Aworker(i, begin, end)).start();
    }
    try {
    Thread.sleep((long) (Math.random() * 5000));
    } catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    System.out.println("judge say : run !");
    begin.countDown(); //裁判一声令下开始跑
    long startTime = System.nanoTime();
    try {
    end.await(); //等待结束
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } finally {
    long endTime = System.nanoTime();
    System.out.println("judge say : all arrived !");
    System.out.println("spend time: " + (endTime - startTime));
    }
    }
    }

输出
1thpeopleisready
2thpeopleisready
4thpeopleisready
6thpeopleisready
3thpeopleisready
10thpeopleisready
8thpeopleisready
5thpeopleisready
7thpeopleisready
9thpeopleisready
judgesay:run!
1thpeoplearrive
4thpeoplearrive
10thpeoplearrive
5thpeoplearrive
2thpeoplearrive
judgesay:allarrived!
9thpeoplearrive
7thpeoplearrive
8thpeoplearrive
3thpeoplearrive
6thpeoplearrive
spendtime:970933
分享到:
评论

相关推荐

    Java并发编程实战

    第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性...

    Java 并发编程实战

    第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性...

    实例讲解Java并发编程之闭锁

    Java并发编程中的闭锁是一种同步工具类,它用于协调多个线程之间的操作顺序,确保一组操作在所有线程完成之前不会继续。闭锁的核心概念是一个内部计数器,初始值为一个正整数,表示需要等待的事件数量。当这个计数器...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    Java并发编程之闭锁与栅栏的实现

    在Java并发编程中,闭锁和栅栏是两种重要的同步工具,它们可以帮助开发者在多线程环境下控制线程的执行顺序和同步。本篇文章将详细解释这两种机制,并通过实例代码进行演示。 一、闭锁(CountDownLatch) 闭锁,由...

    JAVA并发编程实践-构建执行程序块-学习笔记

    JAVA并发编程实践-构建执行程序块-学习笔记 JAVA并发编程实践是指在JAVA编程语言中,使用多线程、并发编程来实现高效、可靠的程序执行。构建执行程序块是指在并发编程中,使用线程安全的类来管理状态,以确保程序的...

    Java并发编程基础.pdf

    ### Java并发编程基础知识点 #### 一、线程与线程状态 - **线程基本概念**: - 在Java中,线程是程序执行流的最小单元,它由一个线程体(实现Runnable接口或者继承Thread类)和数据组成。 - **线程创建**:可以...

    深入浅出_Java并发工具包原理讲解

    Java并发工具包(J.U.C)是Java编程语言中用于并发编程的一系列工具包的统称,它包含了一系列方便实现多线程编程的类和接口,使得开发者可以更加方便地编写高效、线程安全的程序。本文将深入浅出地探讨J.U.C的原理和...

    并发编程笔记20190526.docx

    并发编程是计算机科学中的关键领域,特别是在多核处理器和分布式系统中,它允许程序同时执行多个任务,提高系统的效率和响应性。以下是一些关于并发编程的重要知识点: ### 第一章 线程基础、共享与协作 1. **进程...

    Java并发编程之栅栏(CyclicBarrier)实例介绍

    Java并发编程中的栅栏(CyclicBarrier)是一个同步辅助类,它允许一组线程等待彼此到达某个特定点,然后一起继续执行。这个特定点被称为屏障点。与闭锁(CountDownLatch)不同,闭锁通常是一次性的,而CyclicBarrier...

    java并发编程三剑客

    在Java并发编程中,"三剑客"指的是三个重要的并发工具类:CountDownLatch、CyclicBarrier和Semaphore。它们都是在`java.util.concurrent`包下,主要用于协调多线程间的同步和控制。 首先,CountDownLatch是一个...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    Java并发编程是现代软件开发中的重要领域,尤其在多核处理器普及后,高效地利用并发已成为提高系统性能的关键。本文将全面介绍Java并发编程的基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级...

    并发编程之CountDownLatch

    CountDownLatch 并发编程 CountDownLatch 是一个同步的辅助类,它可以允许一个或多个线程等待,直到一组在其它线程中的操作执行完成。它通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了...

    CountDownLatch、Semaphore等4大并发工具类详解

    Java 并发工具类是 Java 并发编程的核心组件之一,提供了多种同步结构和并发容器,帮助开发者创建高效、可靠的并发程序。本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 ...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    在Java并发编程中,`CountDownLatch`是一个同步辅助类,它允许多个线程等待其他线程完成操作。在批量插入数据的场景下,可以创建一个CountDownLatch对象,初始化为线程的数量,每个线程处理完自己的数据后调用`...

    你会用Java代码模拟高并发吗

    在 Java 编程中,模拟高并发是一种常见的需求,特别是在高并发场景下,需要模拟大量用户请求来验证系统的性能和稳定性。本文将介绍如何使用 Java 代码模拟高并发,通过示例代码详细讲解了使用 Semaphore 和 ...

    深入学习Java同步机制中的底层实现

    `ReentrantLock`和`CountDownLatch`是基于AQS的典型应用,通过它们我们可以深入理解Java并发编程的复杂性以及如何通过AQS来控制线程的同步和通信。通过深入学习这些机制,开发者可以更好地处理并发问题,提高程序的...

    多线程编程.docx

    Java.util.concurrent包是专门为Java并发编程设计的,包含了许多高级并发组件。这些组件可以被分类为以下几大类: - **locks部分**:包括显式锁,如互斥锁和重入锁,它们提供了比synchronized更灵活的锁定机制。 - ...

Global site tag (gtag.js) - Google Analytics