轩辕李的博客 轩辕李的博客
首页
  • Java
  • Spring
  • 其他语言
  • 工具
  • HTML&CSS
  • JavaScript
  • 分布式
  • 代码质量管理
  • 基础
  • 操作系统
  • 计算机网络
  • 编程范式
  • 安全
  • 中间件
  • 心得
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

轩辕李

勇猛精进,星辰大海
首页
  • Java
  • Spring
  • 其他语言
  • 工具
  • HTML&CSS
  • JavaScript
  • 分布式
  • 代码质量管理
  • 基础
  • 操作系统
  • 计算机网络
  • 编程范式
  • 安全
  • 中间件
  • 心得
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java

    • 核心

    • 并发

      • Java并发-线程基础与synchronized关键字
      • Java并发-重入锁ReetrantLock的使用
      • Java并发-信号量Semaphore
      • Java并发-读写锁ReadWriteLock
      • Java并发-倒计时器CountDownLatch
      • Java并发-栅栏CyclicBarrier
      • Java并发-LockSupport线程阻塞工具类
      • Java并发-线程池ThreadPoolExecutor
      • Java并发-阻塞队列BlockingQueue
      • Java并发-以空间换时间之ThreadLocal
      • Java并发-无锁策略CAS与atomic包
      • Java并发-JDK并发容器
      • Java并发-异步调用结果之Future和CompletableFuture
      • Java并发-Fork Join框架
      • Java并发-调试与诊断
    • 经验

    • JVM

    • 企业应用

  • Spring

  • 其他语言

  • 工具

  • 后端
  • Java
  • 并发
轩辕李
2018-06-15

Java并发-栅栏CyclicBarrier

话说北京有个地儿叫大栅栏,在前门前,天桥下,过了天桥就到了天坛。这个大栅栏标准读音是da zha lan,但如果你非得这么念可能要遭到本地人笑话的,正确的土话读法是:da she lan er。
言归正传,今天讲到的工具叫CyclicBarrier,直译过来就叫做栅栏。
栅栏其实就是口袋,玉米装满口袋就需要扎口。

下面通过一个扎口袋的例子初步认识一下CyclicBarrier:

public class CyclicBarrierDemo {
	final static CyclicBarrier BARRIER = new CyclicBarrier(10,()->{
		System.out.println("扎口袋");
	});
	
	static class Maize implements Runnable{
		final static AtomicInteger incr = new AtomicInteger();
		
		@Override
		public void run() {
			try {
				System.out.println("装"+incr.getAndIncrement()+"号玉米进口袋");
				Thread.sleep(new Random().nextInt(10)*100);
				BARRIER.await();
			} catch (InterruptedException | BrokenBarrierException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public static void main(String[] args) {
		ExecutorService executorService = Executors.newFixedThreadPool(10);
		for (int i = 0; i < 10; i++) {
			executorService.execute(new Maize());
		}
		executorService.shutdown();
	}
}

CyclicBarrier的工作流程是:一个人(线程)向口袋装一个玉米后,进行等待(await),直到有10个人分别装了玉米,再通知另一个人(老大)进行扎口袋。
这里的老大定义在CyclicBarrier的构造函数的第二个参数上。
诶,我们发现这个CyclicBarrier怎么跟CountDownLatch那么像呢?除了他没有countDown()方法,好像用法是一样的呢?
别着急,细细查看,他和CountDownLatch还是有比较大的区别的:

  • CountDownLatch.countDown()之后不用阻塞,只是倒计时了一下。而CyclicBarrier是大家必须等待一个时刻,然后呼唤出老大
  • CountDownLatch并没有呼唤老大这个机制

所以还是要区别一下他们两个的用法的,简单来说,倒计时第一个想起的是CountDownLatch;而需要扎口袋或设栅栏则用CyclicBarrier。

编辑 (opens new window)
#CyclicBarrier
上次更新: 2023/06/14
Java并发-倒计时器CountDownLatch
Java并发-LockSupport线程阻塞工具类

← Java并发-倒计时器CountDownLatch Java并发-LockSupport线程阻塞工具类→

最近更新
01
Spring Boot版本新特性
09-15
02
Spring框架版本新特性
09-01
03
Spring Boot开发初体验
08-15
更多文章>
Theme by Vdoing | Copyright © 2018-2025 京ICP备2021021832号-2 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式