1. CyclicBarrier : 初始化count是固定的, 通常用于多个线程同时等待彼此,当所有线程到达某一点时,同时继续进行。
例子:
Int N = 3; final CyclicBarrier cb = new CyclicBarrier(N); for (int i = 0; i < N; i++) { new Thread(new Runnable() { public void run() { Do xxx; cb.await(); //等3个进程同时到达时,才会继续。 }).start(); }
2. CountdownLatch: 一次性的,初始化count是固定的,通常用于主线程等待一堆子线程的完成。
例子:
final CountDownLatch cdl = new CountDownLatch(N); new Thread(new Runnable() { public void run() { cdl.await(); } }).start(); for (int i = 0; i < N; i++) { final int idx = i; new Thread(new Runnable() { public void run() { cdl.countDown(); } }).start(); }
3. Semaphor:就像是一个计数器,调用Release()时增加,调用acquire时减少,如果acquire的数量不足,则等待。
例子:
public class SemaphoreTest { private static final int MAX_THREADS = 5; public static void main(String[] args) throws Exception { Semaphore semaphore = new Semaphore(0); int threadCount = 0; Random random = new Random(); for(int i=0;i<MAX_THREADS;i++) { Thread t = new Thread(new WorkerThread(semaphore, String.format("Thread-%d", i))); t.start(); threadCount++; } semaphore.acquire(threadCount); //获取不到则等待,直到所有任务完成。 } private static class WorkerThread implements Runnable { private Semaphore semaphore; private String name; public WorkerThread(Semaphore semaphore, String name) { this.name = name; this.semaphore = semaphore; } public void run() { semaphore.release(); //增加记数 } } }
4. Phaser:JDK7中新加入的同步对象,比较强大。
可以实现CountdowLatch 和 CyclicBarrier的功能,但是count可以不是固定的。
还可以实现一批进程,按照一个阶段一个阶段的执行,每个阶段都等待其他进程结束后才继续进行。
详细参考这个帖子。
http://niklasschlimm.blogspot.com/2011/12/java-7-understanding-phaser.html
相关推荐
java 高并发应用场景
在Java并发编程中,CountDownLatch、CyclicBarrier和Semaphore是三种重要的线程协作工具,它们都基于AbstractQueuedSynchronizer(AQS)框架来实现线程间的同步和协调。AQS是一个内置的锁和同步组件,它为构建高级...
Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...
本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...
4.1 CountDownLatch 4.2 CyclicBarrier 4.3 Semaphore 4.4 Exchanger 第五章:原子类和无锁编程 5.1 AtomicInteger与AtomicLong 5.2 AtomicReference 第六章:线程池及其应用 6.1 ThreadPoolExecutor 6.2...
Java 提供了多种多线程协作机制,包括CountDownLatch、CyclicBarrier、Semaphore 等。 1. CountDownLatch CountDownLatch 是一种同步工具,允许一个或多个线程等待直到某些操作完成。它可以用来实现线程之间的同步...
AQS 通过 `tryAcquire()` 和 `tryRelease()` 方法控制线程的获取和释放同步状态,而这些方法是由具体实现类(如 ReentrantLock、Semaphore、CountDownLatch 等)来定义的。 **总结:** CountDownLatch 和 ...
如果需要一部分线程完成即可继续,可以选择CyclicBarrier或Semaphore。 在实际编程中,熟练掌握CountDownLatch可以帮助我们更有效地编写高并发程序,解决复杂的同步问题。通过阅读和理解提供的代码样例(如`...
java并发,主要用于初学者学习,主要案列,Thread.join,ThreadLocal,Lock接口,LockSupport,Condition接口,ConcurrentHashMap的实现原理与...Fork/Join 框架,CountDownLatch,CyclicBarrier,Semaphore,Exchanger
同步工具类:concurrent包提供了一些同步工具类,如CountDownLatch、CyclicBarrier、Semaphore等,可以帮助开发者实现复杂的线程协作和同步任务。 并发集合类:concurrent包提供了一些并发集合类,如...
多线程控制的三大安全类:CountDownLatch、CyclicBarrier、Semaphore,这工具包将其封装,可以让初学者更容易学习以及让开发者更容易调用,不需要自己重新编写核心代码。具体事例在源码中。
CountDownLatch/CyclicBarrier/Semaphore CountDownLatch 枚举类的使用 CyclicBarrier Semaphore 阻塞队列 SynchronousQueue Callable接口 阻塞队列的应用——生产者消费者 传统模式 阻塞队列模式 阻塞队列的应用...
有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore
其次,书中会深入讲解Java提供的并发工具类,如Executor框架、ThreadLocal、CountDownLatch、CyclicBarrier、Semaphore等。Executor框架允许我们更灵活地管理和调度线程,避免过度依赖线程的创建和销毁;ThreadLocal...
如果需要重复使用,考虑使用CyclicBarrier或Semaphore等其他同步工具。 - 误用可能导致死锁,比如计数器设置过大或者`countDown()`未正确调用,可能会导致等待的线程永久阻塞。 通过对`countdownlatch-example-...
6. **并发工具类**:如CountDownLatch、CyclicBarrier、Semaphore等,用于协调多线程间的同步。例如,CountDownLatch常用于等待一组线程完成;CyclicBarrier允许一组线程到达一个屏障时暂停,直到所有线程都到达;...
AQS相关应用(CountDownLatch、CyclicBarrier、Semaphore等),executor(ThreadPoolExecutor、ScheduledThreadPoolExecutor、FutureTask等),collection(ConcurrentHashMap、CopyOnWriteArrayList等), ...
与`Semaphore`、`CountDownLatch`等其他同步工具不同的是,`CyclicBarrier`是可循环使用的。也就是说,在所有线程通过屏障后,它可以被重置,以供后续的循环使用。这一特性使得`CyclicBarrier`在需要重复执行相同...
Java 并发工具类中有很多种,今天我们主要介绍四种:CyclicBarrier、CountDownLatch、Semaphore 和 Exchanger。 一、CyclicBarrier CyclicBarrier 是一种同步工具,允许一组线程互相等待,直到到达某个公共屏障点...