`

【Java核心-进阶】Semaphore、CountDownLatch、CyclicBarrier、Phaser

    博客分类:
  • Java
 
阅读更多

Java并发包中有很多可以实现同步的结构。以下几种就属于典型的“非显式”锁:

  • Semaphore:Java版本的信号量实现。
  • CountDownLatch:允许一个或多个线程等待某些操作完成。
  • CyclicBarrier:允许多个线程等待达到某个屏障。
  • Phaser:分阶段地等待多个线程达到某个屏障。

CountDownLatch vs CyclicBarrier

CountDownLatch 和 CyclicBarrier 都可用于等待多个线程完成相关操作(达到某个同步点)。
CountDownLatch 侧重于 让一个线程等待其它多个线程执行完成任务
CyclicBarrier 侧重于 多个线程线程相互等待至某个状态,然后它们再开始同时执行

最主要区别

  • CountDownLatch 不可以被重置,所以无法重用;
  • CyclicBarrier 可以被重置,所以可以重用。

    正常情况下会被自动重置。如果主动调用 reset() 时,有线程还在等待,等待线程会抛异常 BrokenBarrierException。

 

CountDownLatch vs Phaser

Phaser 和 CountDownLatch、CyclicBarrier 都有很相似的地方。
Phaser 顾名思义,就是可以分阶段的进行线程同步。

  • CountDownLatch 只能在创建实例时,通过构造方法指定同步数量;
  • Phaser 支持线程动态地向它注册。

    利用这个动态注册的特性,可以达到分阶段同步控制的目的:
    注册一批操作,等待它们执行结束;再注册一批操作,等它们结束...

 

Semaphore

Semaphore,信号量,就是计数器。它可以限制对资源的访问,防止过多使用者同时占用。

 

两个主要方法:acquire()release(int permits)

典型使用模式:

public static void main(String[] args) {
  Semaphore semaphore = new Semaphore(5);
  for (int i=0; i<10; i++) {
    Thread t = new Thread(new Worker(semaphore));
    t.start();
  }
}

static class Worker implements Runnable {
  private Semaphore semaphore;
  Worker(Semaphore semaphore) {
    this.semaphore = semaphore;
  }

  @Override
  public void run() {
    try {
      semaphore.acquire();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      semaphore.release();
    }
  }
}

CountDownLatch

两个主要方法:await()countDown()

典型使用模式:

public static void main(String[] args) {
  CountDownLatch latch = new CountDownLatch(5);
  for (int i=0; i<5; i++) {
    Thread t = new Thread(new Worker(latch));
    t.start();
  }

  latch.await();
}

static class Worker implements Runnable {
  private CountDownLatch latch;

  Worker(CountDownLatch latch) {
    this.latch = latch;
  }

  @Override
  public void run() {
    lathc.countDown();
  }
}

 

CyclicBarrier

主要方法:await()。正常情况下,CyclicBarrier 是被自动重置。

典型使用模式:

public static void main(String[] args) {
  CyclicBarrier barrier = new CyclicBarrier(5,
      () -> System.out.println("Action go again."));

  for (int i=0; i<5; i++) {
    String workerName = "Worker-" + i;
    Thread t = new Thread(new Worker(workerName, barrier));
    t.start();
  }
}

static class Worker implements Runnable {
  private String name;
  private CyclicBarrier barrier;

  Worker(String name, CyclicBarrier barrier) {
    this.name = name;
    this.barrier = barrier;
  }

  @Override
  public void run() {
    try {
      for (int i=0; i<3; i++) {
        System.out.println(name + " executed " + i);
        barrier.await();
      }
    } catch (BrokenBarrierException | InterruptedException e) {
      e.printStackTrace();
    }
  }
}

 

Phaser

典型使用模式:

public static void main(String[] args) {
  // 初始 party 数为1,是为了通过主线程控制 phaser 不同阶段的操作
  Phaser phaser = new Phaser(1);

  // 第一阶段,5个Worker
  for (int i = 0; i < 5; i++) {
    String workerName = "Phase-1-Worker-" + i;
    Thread t = new Thread(new Worker(workerName, phaser));
    t.start();
  }
  // 开始执行第一阶段:主线程也到达第一阶段
  phaser.arriveAndAwaitAdvance();

  // 第二阶段,3个Worker
  for (int i = 0; i < 3; i++) {
    String workerName = "Phase-2-Worker-" + i;
    Thread t = new Thread(new Worker(workerName, phaser));
    t.start();
  }
  // 开始执行第二阶段:主线程也到达第二阶段
  phaser.arriveAndAwaitAdvance();

  // 各阶段都结束:(主线程)从 phaser 撤销
  phaser.arriveAndDeregister();
}

static class Worker implements Runnable {
  private String name;
  private Phaser phaser;

  Worker(String name, Phaser phaser) {
    this.name = name;
    this.phaser = phaser;

    // 将当前线程注册到 phaser
    phaser.register();
  }

  @Override
  public void run() {
    // 到达 phaser,并等待其它线程也到达
    phaser.arriveAndAwaitAdvance();

    System.out.println(name + " done.");

    // 到达 phaser,并将 Worker 从 phaser 撤销
    phaser.arriveAndDeregister();
  }
}

 

分享到:
评论

相关推荐

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

    本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...

    Java-concurrency-master.zip

    7. **并发工具类**:`java.util.concurrent`包提供了丰富的并发工具,如`Semaphore`(信号量)、`CountDownLatch`(计数器)、`CyclicBarrier`(栅栏)和`Phaser`(同步屏障),用于控制并发流程。 8. **并发模式**...

    《Java语言程序设计(进阶篇)》 课后习题第25章代码chapter25.rar

    `wait()`, `notify()`, `notifyAll()`方法)、线程池(`ExecutorService`, `ThreadPoolExecutor`, `Future`接口),以及并发工具类(`Semaphore`, `CyclicBarrier`, `CountDownLatch`, `Phaser`等)。 2. **网络...

    java-thread-vedio.rar_java vedio

    - **Phaser**:Java 7引入的同步工具,可以替代CountDownLatch和CyclicBarrier。 5. **线程优先级**: Java中线程有10个优先级,默认优先级是5(NORM_PRIORITY)。优先级高的线程更有可能获取CPU资源,但并不保证...

    java-advanced-training:java进阶训练

    11. **并发编程**:探讨Java并发编程的高级话题,如Fork/Join框架、Future和Callable接口,以及并发工具类如CountDownLatch和Phaser。 12. **Java 8及以后的新特性**:掌握Lambda表达式、Stream API、Optional类、...

    Java并发工具类示例

    本文将详细解析Java并发工具类,并通过示例代码介绍`CountDownLatch`、`CyclicBarrier`、`Phaser`、`Semaphore`和`ThreadLocal`的用法。 1. **CountDownLatch** `CountDownLatch`是一个计数器,通常用于等待多个...

    JAVA并发编程实践

    根据给定文件的信息“JAVA并发编程实践”以及其描述为“Java并发学习资料”,我们可以从中提炼出关于Java并发编程的一些核心知识点。Java并发编程是Java高级特性之一,它允许开发者编写能够同时执行多个任务的程序,...

    Java多线程编程实战指南-核心篇

    此外,Phaser、CyclicBarrier和CountDownLatch等同步辅助类也是线程间协调的重要工具。 线程池是Java并发编程中不可或缺的一部分。Executor框架提供了ThreadPoolExecutor,它允许我们预先创建一定数量的线程,管理...

    java多线程资料

    书中还介绍了Java提供的并发工具,如Semaphore、CyclicBarrier、CountDownLatch和Phaser等,以及ExecutorService和ThreadPoolExecutor的使用,这些都是Java 5及更高版本中引入的重要并发框架。 学习这两个资源,你...

    java 高并发解决 思路

    - **CyclicBarrier/Phaser**:循环栅栏,允许一组线程等待其他线程到达某个点后继续执行。 - **Semaphore**:信号量,用于限制同时访问的线程数量。 5. **并发设计模式** - **双检锁/双重校验锁(DCL)**:用于...

    Java并发编程实践-电子书1-9章pdf

    3. **第三章:并发工具类** - 本章可能会详细介绍Java并发包(java.util.concurrent)中的工具类,如ExecutorService、Future、Callable、Semaphore、CyclicBarrier、CountDownLatch等,这些工具极大地简化了并发...

    【Java核心知识面试】-15个顶级Java多线程面试题答案.zip

    Java多线程是Java编程中的...同时,面试中可能还会涉及到J.U.C(Java并发包)中的高级特性和最佳实践,例如CountDownLatch、CyclicBarrier、Semaphore等工具类的使用。熟悉并掌握这些内容,将有助于在面试中表现出色。

    【Java技术资料】-(机构内训资料)Java并发体系学习思维笔记

    此外,Semaphore、CountDownLatch、CyclicBarrier 和 Phaser 是Java并发工具类,它们提供了灵活的线程控制,用于协调多个线程的执行。 再者,Java并发集合框架,如ConcurrentHashMap、CopyOnWriteArrayList和...

    JAVA核心知识点整理.pdf

    此外,还对Java中的并发工具类进行了介绍,如CountDownLatch、CyclicBarrier、Semaphore、Phaser等。 微服务架构是现代Java应用开发中的一种常见模式,文档对此也有所涉及,讲解了微服务架构的定义、特点、以及与...

    《Java高级程序设计》-王路群-电子教案-3907.rar

    8. **Java并发编程**:Java并发库提供了一系列工具类和接口,如CountDownLatch、 Phaser、 Atomic类等,这些工具用于实现复杂并发场景下的协作和同步。 9. **Spring框架**:作为Java企业级应用的主流框架,Spring的...

    java常用锁使用demo工程

    - **Phaser**:Java 7引入的新型同步工具,类似于CyclicBarrier,但更强大,支持动态调整参与线程数。 4. 并发集合: - **ConcurrentHashMap**:线程安全的哈希映射,比`synchronized` HashMap性能更好。 - **...

    Packt.Java.7.Concurrency.Cookbook

    - **Phaser类**:Phaser是Java 7中新增的一个类,用于替代CyclicBarrier和CountDownLatch。它提供了一种更加灵活的方式来控制线程间的等待和同步。 - **Fork/Join框架**:这是Java 7中最引人注目的新特性之一。Fork/...

    java并发编程实战源码,java并发编程实战pdf,Java源码.zip

    - **Phaser**:类似CyclicBarrier,但更加灵活,支持动态调整参与线程数。 4. **并发集合** - **ConcurrentHashMap**:线程安全的哈希表,提供了高并发下的高效操作。 - **CopyOnWriteArrayList和...

    java5 并发包 (concurrent)思维导图

    - `Phaser`:在Java 7中引入,类似于`CyclicBarrier`,但更灵活,可以动态改变参与线程的数量。 4. **原子类(Atomic Classes)**: - `AtomicInteger`、`AtomicLong`、`AtomicBoolean`等:提供原子操作的整型、...

    backport-util-concurrent_java_backport_

    4. **CountDownLatch和Semaphore**:这些是并发控制工具,CountDownLatch用于一次性释放多个等待线程,Semaphore则用于控制同时访问特定资源的线程数量。 5. **ConcurrentHashMap**:这是一个高度并发的哈希映射,...

Global site tag (gtag.js) - Google Analytics