# 14. Java 并发 API 中的线程同步工具类分析
# 标准答案
✅ Java 并发 API 提供了多种线程同步工具类,如 CountDownLatch
、Semaphore
和 CyclicBarrier
,用于实现线程间的协调和同步。
# 答案解析
# 1️⃣ CountDownLatch
- 作用:允许一个或多个线程等待其他线程完成操作。
- 应用场景:实现线程的并发启动或等待多个线程完成。
# 2️⃣ Semaphore
- 作用:控制同时访问特定资源的线程数量。
- 应用场景:实现资源的限流或访问控制。
# 3️⃣ CyclicBarrier
- 作用:让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时,所有被阻塞的线程才继续执行。
- 应用场景:实现多线程的分阶段执行。
# 常见误区
- ❌ 误区1:认为
CountDownLatch
可以重复使用。实际上,CountDownLatch
不能重置。 - ❌ 误区2:忽视
Semaphore
的公平性。默认情况下,Semaphore
是非公平的。
工具类 | 描述 | 适用场景 |
---|---|---|
CountDownLatch | 等待其他线程完成 | 并发启动、任务等待 |
Semaphore | 控制资源访问 | 资源限流、访问控制 |
CyclicBarrier | 分阶段执行 | 多线程分阶段任务 |
# 3️⃣ 典型场景与解决方案
# ✅ 适合使用CountDownLatch的场景
- 并发启动
- 等待多个线程准备好后同时启动。
# ❌ 不能用CountDownLatch解决的场景
- 重复使用
- 需要重复使用的场景。
# 4️⃣ 底层原理解析
# 1. CountDownLatch的实现
- 通过计数器实现线程的等待和通知。
# 2. Semaphore的实现
- 通过许可证机制控制资源的访问。
# 企业真实场景问题分析
# Situation(业务背景)
在某高并发系统中,需要控制同时访问资源的线程数量。
# Task(核心任务 & 关键挑战)
- 如何控制同时访问资源的线程数量?
- 如何实现线程的并发启动?
# Action(技术方案 & 逐步拆解)
- 方案1:使用Semaphore
- 控制同时访问资源的线程数量。
- 方案2:使用CountDownLatch
- 实现线程的并发启动。
# Result(结果分析)
- 使用Semaphore可以控制资源的访问,提高系统的稳定性。
- 使用CountDownLatch可以实现线程的并发启动,提高系统的性能。
# 深入追问
🔹 如何选择合适的线程同步工具类?
- 根据任务的复杂性和同步需求选择合适的工具类。
🔹 CountDownLatch与CyclicBarrier的区别是什么?
- CountDownLatch用于等待其他线程完成,CyclicBarrier用于分阶段执行。
# 相关面试题
- 如何使用CountDownLatch实现线程的并发启动?
- Semaphore的公平性如何设置?
- CountDownLatch与CyclicBarrier的区别是什么?