CountDownLatch只能使用一次,cyclicBarrier可以重复使用,同时还提供barrierAction。 在功能上,cyclicBarrier可以完全替代countdownlatch, 但是性能上,如果同时工作的线程在几百数量级,则两者性能差不多,但是在千/万数量级的线程时,countdownlatch性能远远高于cyclicbarrier。
下面是测试代码,改变count值,观察输出结果:
public class Test2
{
CyclicBarrier barrier;
CountDownLatch latch;
int count;
long beginTime;
public static void main(String... args)
{
final Test2 t = new Test2();
t.count = 5000;
t.beginTime = System.currentTimeMillis();
t.barrier = new CyclicBarrier(t.count, new Runnable() {
@Override
public void run()
{
System.out.println("cyclic barrier time consumed: " + (System.currentTimeMillis() - t.beginTime));
}
});
t.latch = new CountDownLatch(t.count);
// t.test();// tatal: 5177344, free: 3357624, used: 1819720 cyclic barrier time consumed: 766
// t.test2();// tatal: 5177344, free: 4454904, used: 722440 countdown latch time consumed: 516
// long total = Runtime.getRuntime().totalMemory();
// long free = Runtime.getRuntime().freeMemory();
// System.out.println("tatal: "+ total + ", free: "+ free +", used: "+ (total-free));
}
/**
* cyclic barrier
*/
private void test()
{
for (int i = 0; i < count; i++)
{
new TestThread().start();
}
}
/**
* countdown latch
*/
private void test2()
{
for (int i = 0; i < count; i++)
{
new TestThread2().start();
}
try
{
latch.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("countdown latch time consumed: " + (System.currentTimeMillis() - beginTime));
}
class TestThread extends Thread
{
@Override
public void run()
{
try
{
Thread.sleep(100);
barrier.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
catch (BrokenBarrierException e)
{
e.printStackTrace();
}
}
}
class TestThread2 extends Thread
{
@Override
public void run()
{
try
{
Thread.sleep(100);
latch.countDown();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf
java并发编程中CountDownLatch和CyclicBarrier的使用.pdf
1. 什么是线程? 2. 线程和进程有什么区别? 3. 如何在 Java 中实现...7. Java 中 CyclicBarrier 和 CountDownLatch 有什么不同? 8. Java 内存模型是什么? 9. Java 中的 volatile 变量是什么? ......... ........
CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。用法略有不同,测试代码如下:
目录: 简介 1.1 并发编程与线程协作 1.2 CyclicBarrier概述 CyclicBarrier的基本用法 2.1 创建CyclicBarrier对象 2.2 await()方法 控制线程协作数量 ...CyclicBarrier与CountDownLatch的对比 最佳实践与注意事项
Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用 CountDownLatch、CyclicBarrier、Semaphore这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。 Java并发...
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
目录: 简介 1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 ...CountDownLatch与CyclicBarrier的对比 最佳实践与注意事项
5、"利用CyclicBarrier和CountDownLatch解决并发协调难题,提升多线程程序的执行效率和可控性。#并发工具类 #Java并发编程" 6、"volatile与synchronized的巧妙运用,确保数据可见性,解决并发编程中的常见痛点。#...
有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore
CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。
CyclicBarrier是Java中的一个同步工具类,用于协调多个线程之间的同步。它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都...
java并发之并发工具类,并发工具类有很多,这里主要介绍了CyclicBarrier、CountDownLatch、Semaphore、Exchanger
在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier在释放等待线程后可以重用,所以称它为 循环 的barrier。 CyclicBarrier 支持一个可选的 Runnable命令,...
主要介绍了Java并发实例之CyclicBarrier的使用,涉及CyclicBarrier的介绍,以及相关的并发实例,具有一定参考价值,需要的朋友可以了解下。