当前位置: 首页 > 图灵资讯 > java面试题> 解释Java中的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore

解释Java中的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore

来源:图灵教育
时间:2024-09-26 14:02:09

CountDownLatch

什么是CountDownLatch?

CountDownLatch就像一个倒计时的门闩。它允许一个或多个线程等待,直到其他线程完成一组操作。

如何工作?

  1. 初始化:设置一个计数器,初始值为你希望等待的事件数量。
  2. 倒计时:每当一个事件完成,计数器就减一。
  3. 等待:主线程或者其他线程会等待,直到计数器减到零。

举个例子

想象一下,你和几个小伙伴决定一起去看电影,但必须等所有人都到齐才能出发。你们可以用CountDownLatch来实现:

  1. 初始化:设置计数器为小伙伴的总数,比如5。
  2. 倒计时:每来一个小伙伴,计数器减一。
  3. 等待:主线程(你)会一直等,直到计数器减到零(所有小伙伴都到齐)。

使用场景

  • 等待多个线程完成初始化工作,然后再一起开始执行主任务。
  • 实现某个线程等待其他线程完成一组任务。

CyclicBarrier

什么是CyclicBarrier?

CyclicBarrier就像一个栅栏,所有线程都必须在栅栏前集合,等大家都到齐了,栅栏才会打开,所有线程一起继续执行。

如何工作?

  1. 初始化:设置一个障碍点,指定需要等待的线程数量。
  2. 等待:所有线程都会在障碍点等待,直到指定数量的线程都到达。
  3. 继续执行:当所有线程都到达障碍点后,栅栏打开,所有线程继续执行。

举个例子

想象你和几个小伙伴在玩接力赛,每一轮都要等所有人都到达终点才能开始下一轮。你们可以用CyclicBarrier来实现:

  1. 初始化:设置障碍点,指定需要等待的小伙伴数量,比如5。
  2. 等待:所有小伙伴都到达终点,栅栏打开。
  3. 继续执行:所有小伙伴继续下一轮比赛。

使用场景

  • 多线程协作,所有线程在某个点集合,然后一起继续执行。
  • 实现分阶段任务,每个阶段都需要所有线程完成才能进入下一个阶段。

Semaphore

什么是Semaphore?

Semaphore就像一个停车场的限流器,用来控制同时访问某个资源的线程数量。

如何工作?

  1. 初始化:设置一个许可数,表示可以同时访问资源的最大线程数。
  2. 获取许可:线程在访问资源前,必须先获取一个许可。
  3. 释放许可:线程访问完资源后,必须释放许可。

举个例子

想象你有一个停车场,最多只能停10辆车。你可以用Semaphore来实现:

  1. 初始化:设置许可数为10。
  2. 获取许可:每来一辆车,获取一个许可。
  3. 释放许可:每离开一辆车,释放一个许可。

使用场景

  • 控制对共享资源的访问,比如数据库连接池、限流等。
  • 实现资源的限量访问,防止资源耗尽。

小结

  • CountDownLatch:用于一个或多个线程等待其他线程完成一组操作。
  • CyclicBarrier:用于一组线程在某个点集合,然后一起继续执行。
  • Semaphore:用于控制同时访问某个资源的线程数量。