# 14. Java 并发 API 中的线程同步工具类分析

# 标准答案

✅ Java 并发 API 提供了多种线程同步工具类,如 CountDownLatchSemaphoreCyclicBarrier,用于实现线程间的协调和同步。

# 答案解析

# 1️⃣ CountDownLatch

  • 作用:允许一个或多个线程等待其他线程完成操作。
  • 应用场景:实现线程的并发启动或等待多个线程完成。

# 2️⃣ Semaphore

  • 作用:控制同时访问特定资源的线程数量。
  • 应用场景:实现资源的限流或访问控制。

# 3️⃣ CyclicBarrier

  • 作用:让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时,所有被阻塞的线程才继续执行。
  • 应用场景:实现多线程的分阶段执行。

# 常见误区

  • 误区1:认为 CountDownLatch 可以重复使用。实际上,CountDownLatch 不能重置。
  • 误区2:忽视 Semaphore 的公平性。默认情况下,Semaphore 是非公平的。
工具类 描述 适用场景
CountDownLatch 等待其他线程完成 并发启动、任务等待
Semaphore 控制资源访问 资源限流、访问控制
CyclicBarrier 分阶段执行 多线程分阶段任务

# 3️⃣ 典型场景与解决方案

# ✅ 适合使用CountDownLatch的场景

  1. 并发启动
    • 等待多个线程准备好后同时启动。

# ❌ 不能用CountDownLatch解决的场景

  1. 重复使用
    • 需要重复使用的场景。

# 4️⃣ 底层原理解析

# 1. CountDownLatch的实现

  • 通过计数器实现线程的等待和通知。

# 2. Semaphore的实现

  • 通过许可证机制控制资源的访问。

# 企业真实场景问题分析

# Situation(业务背景)

在某高并发系统中,需要控制同时访问资源的线程数量。

# Task(核心任务 & 关键挑战)

  • 如何控制同时访问资源的线程数量?
  • 如何实现线程的并发启动?

# Action(技术方案 & 逐步拆解)

  • 方案1:使用Semaphore
    • 控制同时访问资源的线程数量。
  • 方案2:使用CountDownLatch
    • 实现线程的并发启动。

# Result(结果分析)

  • 使用Semaphore可以控制资源的访问,提高系统的稳定性。
  • 使用CountDownLatch可以实现线程的并发启动,提高系统的性能。

# 深入追问

🔹 如何选择合适的线程同步工具类?

  • 根据任务的复杂性和同步需求选择合适的工具类。

🔹 CountDownLatch与CyclicBarrier的区别是什么?

  • CountDownLatch用于等待其他线程完成,CyclicBarrier用于分阶段执行。

# 相关面试题

  1. 如何使用CountDownLatch实现线程的并发启动?
  2. Semaphore的公平性如何设置?
  3. CountDownLatch与CyclicBarrier的区别是什么?