java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java中Semaphore

Java中的Semaphore(信号量)全面解析

作者:MOONNIFE

信号量(Semaphore)是Java多线程兵法中的一种JDK内置同步器,通过它可以实现多线程对公共资源的并发访问控制,这篇文章主要介绍了Java中Semaphore(信号量)的相关资料,需要的朋友可以参考下

前言

Semaphore 是 Java 并发包(java.util.concurrent)中的核心同步工具类,用于​​控制对共享资源的并发访问数量​​,通过“许可证”机制实现资源限流。下面从多个维度全面解析其设计原理和应用实践。

一、基本概念与核心原理​​

1. 核心模型​​

​​2. 底层实现​​

基于 ​​AQS(AbstractQueuedSynchronizer)​​ 的共享锁模式实现:

​二、使用方式与代码示例​​

1. 基础用法​​

import java.util.concurrent.Semaphore;

public class PrinterService {
    private final Semaphore semaphore = new Semaphore(3); // 初始化3个许可证

    public void printDocument(String docName) throws InterruptedException {
        semaphore.acquire(); // 获取许可(阻塞直到可用)
        try {
            System.out.println("Printing: " + docName);
            Thread.sleep(1000); // 模拟打印耗时
        } finally {
            semaphore.release(); // 必须释放许可!
        }
    }
}

​​2. 高级方法:超时与批量操作​​

// 尝试获取许可(超时控制)
if (semaphore.tryAcquire(2, 500, TimeUnit.MILLISECONDS)) {
    try {
        // 执行任务
    } finally {
        semaphore.release(2); // 释放多个许可
    }
} else {
    System.out.println("获取许可超时!");
}

3. 多线程场景示例​​

public static void main(String[] args) {
    PrinterService service = new PrinterService();
    for (int i = 0; i < 10; i++) {
        new Thread(() -> {
            try {
                service.printDocument("Doc-" + Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

​输出效果​​:

Printing: Doc-Thread-0  
Printing: Doc-Thread-1  
Printing: Doc-Thread-2  // 仅3个线程并发执行  
Thread-2 释放许可 → Thread-3 开始打印  
...  

三、优缺点分析​​

​维度​​优点​​缺点​
​性能​读操作无锁,高并发场景吞吐量高(尤其非公平模式)。写操作需复制数组,频繁修改时性能差(时间复杂度 O(n))。
​资源控制​精准限制并发量,避免资源过载。许可证泄漏(未释放)会导致资源逐渐耗尽。
​一致性​弱一致性模型,迭代器安全(基于快照)。无法实时感知最新修改,迭代期间数据可能过期。
​灵活性​支持动态调整许可证数量、超时控制、批量操作。复杂同步需求需结合其他工具(如 CountDownLatch)。

四、适用场景​​

1. 资源池管理​​

2. 流量控制​​

3. 物理资源共享​​

​五、注意事项与最佳实践​​

总结​​

Semaphore 是解决​​资源并发控制​​的利器,尤其适合​​读多写少、资源池限流、API控频​​等场景。其基于 AQS 的实现兼顾了灵活性与性能,但需注意许可证管理的原子性和释放的可靠性。在高并发系统中,合理使用 Semaphore 能有效提升系统稳定性与资源利用率🔥。

到此这篇关于Java中的Semaphore(信号量)的文章就介绍到这了,更多相关Java中Semaphore内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文