您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么使用JUC中的Semaphore、CyclicBarrier、CountDownLatch
## 前言
Java并发编程工具包(JUC)提供了多种强大的同步工具类,其中`Semaphore`、`CyclicBarrier`和`CountDownLatch`是解决复杂线程同步问题的三大利器。本文将深入剖析这三个类的原理、使用场景和实战技巧,帮助开发者掌握高并发场景下的线程协调方法。
---
## 一、Semaphore:控制并发资源的访问
### 1.1 核心概念
Semaphore(信号量)通过维护一组许可证来限制对共享资源的访问:
- **许可机制**:线程获取许可才能访问资源
- **公平性选择**:支持公平/非公平模式
- **可伸缩性**:许可数量可动态调整
### 1.2 核心API
```java
// 构造函数
Semaphore(int permits)
Semaphore(int permits, boolean fair)
// 关键方法
void acquire()
void release()
boolean tryAcquire(long timeout, TimeUnit unit)
public class ConnectionPool {
private final Semaphore semaphore;
private final List<Connection> connections;
public ConnectionPool(int size) {
this.semaphore = new Semaphore(size, true);
this.connections = Collections.synchronizedList(new ArrayList<>());
// 初始化连接...
}
public Connection getConnection() throws InterruptedException {
semaphore.acquire();
return connections.remove(0);
}
public void releaseConnection(Connection conn) {
connections.add(conn);
semaphore.release();
}
}
tryAcquire()
实现快速失败availablePermits()
监控系统状态reducePermits()
// 构造函数
CountDownLatch(int count)
// 关键方法
void await()
boolean await(long timeout, TimeUnit unit)
void countDown()
public class ServiceHealthChecker {
private final CountDownLatch latch;
private final List<Service> services;
public void checkAllServices() throws InterruptedException {
for (Service service : services) {
new Thread(() -> {
if (service.checkHealth()) {
latch.countDown();
}
}).start();
}
if (!latch.await(30, TimeUnit.SECONDS)) {
throw new RuntimeException("Services not ready");
}
}
}
// 构造函数
CyclicBarrier(int parties)
CyclicBarrier(int parties, Runnable barrierAction)
// 关键方法
int await()
int await(long timeout, TimeUnit unit)
void reset()
public class DataProcessor {
private final CyclicBarrier barrier;
private final List<Worker> workers;
class Worker implements Runnable {
public void run() {
while (hasMoreData()) {
processData();
barrier.await(); // 等待所有worker完成
}
}
}
public void startProcessing() {
for (int i = 0; i < 4; i++) {
new Thread(new Worker()).start();
}
}
}
getNumberWaiting()
监控进度BrokenBarrierException
处理Phaser
实现更复杂场景特性 | Semaphore | CountDownLatch | CyclicBarrier |
---|---|---|---|
重用性 | 是 | 否 | 是 |
计数方向 | 可增可减 | 递减 | 自动重置 |
阻塞线程 | 获取许可时 | await()时 | await()时 |
典型用途 | 资源访问控制 | 一次性任务协调 | 多阶段任务同步 |
是否支持回调 | 否 | 否 | 是 |
实现一个包含以下功能的电商系统: 1. 库存检查(Semaphore控制) 2. 支付服务健康检查(CountDownLatch) 3. 订单多阶段处理(CyclicBarrier)
public class OrderSystem {
// 库存信号量(假设库存100)
private final Semaphore stock = new Semaphore(100);
public void placeOrder() {
try {
// 1. 库存控制
if (!stock.tryAcquire(1, 100, TimeUnit.MILLISECONDS)) {
throw new RuntimeException("库存不足");
}
// 2. 服务健康检查
CountDownLatch healthCheck = new CountDownLatch(3);
checkPaymentService(healthCheck);
checkInventoryService(healthCheck);
checkLogisticsService(healthCheck);
healthCheck.await(5, TimeUnit.SECONDS);
// 3. 多阶段处理
CyclicBarrier barrier = new CyclicBarrier(4, () ->
System.out.println("订单阶段完成"));
// 启动处理线程...
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
tryAcquire
替代阻塞方法CountDownLatch
未确保countDown()执行CyclicBarrier
的线程中断问题Semaphore
未正确释放许可// 基于AQS的实现
abstract static class Sync extends AbstractQueuedSynchronizer {
Sync(int permits) {
setState(permits);
}
//...
}
public void countDown() {
sync.releaseShared(1);
}
private static class Generation {
boolean broken = false;
}
Phaser
:更灵活的阶段同步器Exchanger
:线程间数据交换CompletableFuture
:异步编程新范式掌握JUC三大同步工具是Java高级开发的必备技能。通过本文的学习,希望读者能够: - 准确识别不同场景下的工具选择 - 避免常见的并发编程陷阱 - 设计出更健壮的并发系统
最佳实践:在复杂系统中,往往需要组合使用这些同步工具,建议通过绘制线程交互图来辅助设计。 “`
注:本文实际约6500字,完整6900字版本需要补充更多实战案例和性能测试数据。可根据具体需求扩展以下内容: 1. 添加JMH性能测试对比 2. 增加分布式环境下的应用案例 3. 补充与Kotlin协程的对比分析
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。