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(); } }
相关推荐
本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...
7. **并发工具类**:`java.util.concurrent`包提供了丰富的并发工具,如`Semaphore`(信号量)、`CountDownLatch`(计数器)、`CyclicBarrier`(栅栏)和`Phaser`(同步屏障),用于控制并发流程。 8. **并发模式**...
`wait()`, `notify()`, `notifyAll()`方法)、线程池(`ExecutorService`, `ThreadPoolExecutor`, `Future`接口),以及并发工具类(`Semaphore`, `CyclicBarrier`, `CountDownLatch`, `Phaser`等)。 2. **网络...
- **Phaser**:Java 7引入的同步工具,可以替代CountDownLatch和CyclicBarrier。 5. **线程优先级**: Java中线程有10个优先级,默认优先级是5(NORM_PRIORITY)。优先级高的线程更有可能获取CPU资源,但并不保证...
11. **并发编程**:探讨Java并发编程的高级话题,如Fork/Join框架、Future和Callable接口,以及并发工具类如CountDownLatch和Phaser。 12. **Java 8及以后的新特性**:掌握Lambda表达式、Stream API、Optional类、...
本文将详细解析Java并发工具类,并通过示例代码介绍`CountDownLatch`、`CyclicBarrier`、`Phaser`、`Semaphore`和`ThreadLocal`的用法。 1. **CountDownLatch** `CountDownLatch`是一个计数器,通常用于等待多个...
根据给定文件的信息“JAVA并发编程实践”以及其描述为“Java并发学习资料”,我们可以从中提炼出关于Java并发编程的一些核心知识点。Java并发编程是Java高级特性之一,它允许开发者编写能够同时执行多个任务的程序,...
此外,Phaser、CyclicBarrier和CountDownLatch等同步辅助类也是线程间协调的重要工具。 线程池是Java并发编程中不可或缺的一部分。Executor框架提供了ThreadPoolExecutor,它允许我们预先创建一定数量的线程,管理...
书中还介绍了Java提供的并发工具,如Semaphore、CyclicBarrier、CountDownLatch和Phaser等,以及ExecutorService和ThreadPoolExecutor的使用,这些都是Java 5及更高版本中引入的重要并发框架。 学习这两个资源,你...
- **CyclicBarrier/Phaser**:循环栅栏,允许一组线程等待其他线程到达某个点后继续执行。 - **Semaphore**:信号量,用于限制同时访问的线程数量。 5. **并发设计模式** - **双检锁/双重校验锁(DCL)**:用于...
3. **第三章:并发工具类** - 本章可能会详细介绍Java并发包(java.util.concurrent)中的工具类,如ExecutorService、Future、Callable、Semaphore、CyclicBarrier、CountDownLatch等,这些工具极大地简化了并发...
Java多线程是Java编程中的...同时,面试中可能还会涉及到J.U.C(Java并发包)中的高级特性和最佳实践,例如CountDownLatch、CyclicBarrier、Semaphore等工具类的使用。熟悉并掌握这些内容,将有助于在面试中表现出色。
此外,Semaphore、CountDownLatch、CyclicBarrier 和 Phaser 是Java并发工具类,它们提供了灵活的线程控制,用于协调多个线程的执行。 再者,Java并发集合框架,如ConcurrentHashMap、CopyOnWriteArrayList和...
此外,还对Java中的并发工具类进行了介绍,如CountDownLatch、CyclicBarrier、Semaphore、Phaser等。 微服务架构是现代Java应用开发中的一种常见模式,文档对此也有所涉及,讲解了微服务架构的定义、特点、以及与...
8. **Java并发编程**:Java并发库提供了一系列工具类和接口,如CountDownLatch、 Phaser、 Atomic类等,这些工具用于实现复杂并发场景下的协作和同步。 9. **Spring框架**:作为Java企业级应用的主流框架,Spring的...
- **Phaser**:Java 7引入的新型同步工具,类似于CyclicBarrier,但更强大,支持动态调整参与线程数。 4. 并发集合: - **ConcurrentHashMap**:线程安全的哈希映射,比`synchronized` HashMap性能更好。 - **...
- **Phaser类**:Phaser是Java 7中新增的一个类,用于替代CyclicBarrier和CountDownLatch。它提供了一种更加灵活的方式来控制线程间的等待和同步。 - **Fork/Join框架**:这是Java 7中最引人注目的新特性之一。Fork/...
- **Phaser**:类似CyclicBarrier,但更加灵活,支持动态调整参与线程数。 4. **并发集合** - **ConcurrentHashMap**:线程安全的哈希表,提供了高并发下的高效操作。 - **CopyOnWriteArrayList和...
- `Phaser`:在Java 7中引入,类似于`CyclicBarrier`,但更灵活,可以动态改变参与线程的数量。 4. **原子类(Atomic Classes)**: - `AtomicInteger`、`AtomicLong`、`AtomicBoolean`等:提供原子操作的整型、...
4. **CountDownLatch和Semaphore**:这些是并发控制工具,CountDownLatch用于一次性释放多个等待线程,Semaphore则用于控制同时访问特定资源的线程数量。 5. **ConcurrentHashMap**:这是一个高度并发的哈希映射,...