写点什么

CountDownLatch、CyclicBarrier 和 Semaphore 区别及底层原理

  • 2022 年 5 月 11 日
  • 本文字数:1135 字

    阅读完需:约 4 分钟

主线程开始执行


Thread-0->0


Thread-0->1


Thread-0->2


Thread-1->0


Thread-1->1


Thread-1->2


两个子线程都执行完毕,继续执行主线程


[](()二、CyclicBarrier




CyclicBarrier 是一个同步工具类。利用 CyclicBarrier 类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。例如比赛时要等运动员都上场后才开始。

[](()1、底层原理

CyclicBarrier 基于 Condition 来实现的。

[](()2、实例

public class Main {


static class TaskThread extends Thread {


CyclicBarrier barrier;


public TaskThread(CyclicBarrier barrier) {


this.barrier = barrier;


}


@Override


public void run() {


try {


Thread.sleep(1000);


System.out.println(getName() + "比赛准备");


barrier.await();


System.out.println(getName() + "到达终点");


} catch (Exception e) {


e.printStackTrace();


}


}


}


public static void main(String[] args) {


int threadNum = 5;


CyclicBarrier barrier = new CyclicBarrier(threadNum, () -> System.out.println(Thread.currentThread().getName() + "最后一个也准备好了,比赛开始"));


for (int i = 0; i < threadNum; i++) {


new TaskThread(barrier).start();


}


}


}


控制台输出:


Thread-1 比赛准备


Thread-0 比赛准备


Thread-3 比赛准备


Thread-4 比赛准备


Thread-2 比赛准备


Thread-2 最后一个也准备好了,比赛开始


Thread-2 到达终点


Thread-0 到达终点


Thread-4 到达终点


Thread-3 到达终点


Thread-1 到达终点


[](()三、Semaphore




Semaphore 翻译成字面意思为 信号量,Semaphore 可以控制同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

[](()1、底层原理

Semaphore 内部是通过 AQS 来实现的。

[](()2、实例

public class Main {


// 小区楼下停车场同时容纳的车辆 2


private static Semaphore semaphore = new Semaphore(2);


public static void main(String[] args) {


// 模拟 5 辆车进入停车场


for (int i = 0; i < 5; i++) {


new Thread(() -> {


try {


System.out.println(Thread.currentThread().getName() + "来到停车场");


if (semaphore.availablePermits() == 0) {


System.out.println("车位不足,请耐心等待");


}


// 获取令牌尝试进入停车场


semaphore.acquire();


System.out.println(Thread.currentThread().getName() + "成功进入停车场");


// 模拟车辆在停车场停留的时间


Thread.sleep(new Random().nextInt(10000));


System.out.println(Thread.currentThread().getName() + "驶出停车场");


// 释放令牌,腾出停车场车位


semaphore.release();


} catch (InterruptedException e) {


e.printStackTrace();


}


}, i + "号车").start();


}


}


}


控制台输出:


0 号车来到停车场


4 号车来到停车场


0 号车成功进入停车场


2 号车来到停车场


车位不足,请耐心等待

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
CountDownLatch、CyclicBarrier和Semaphore区别及底层原理_Java_爱好编程进阶_InfoQ写作社区