Java中使用信号量——Semaphore

本文介绍了一个使用Java实现的多线程示例,其中主线程通过信号量等待子线程完成任务后再继续执行。子线程从GUI获取数据,并在完成后释放信号量。

 主线程中:

 

子线程

 

 

### Java 中多线程编程信号量的实现方式 #### 什么是信号量信号量Semaphore)是一种用于控制多个线程对共享资源访问数量的同步工具。它可以限制同时访问某一特定资源的操作数,从而防止竞争条件的发生。Java 提供了 `java.util.concurrent.Semaphore` 类来支持信号量的功能。 #### Semaphore 的基本概念 `Semaphore` 可以维护一组许可证的概念。每当调用 `acquire()` 方法时,如果还有可用的许可,则会获取一个;如果没有剩余许可,则当前线程会被阻塞直到有新的许可释放出来。当某个线程完成操作后,可以通过调用 `release()` 方法返回一个许可给其他等待中的线程使用[^3]。 #### 创建和初始化 Signal 创建一个 `Semaphore` 对象通常需要指定初始的许可数目以及是否采用公平策略: - **参数一**:表示有多少个许可可供分配; - **参数二**(可选布尔值):决定该 semaphore 是否遵循 FIFO 公平调度原则,默认为 false 表示非公平模式。 下面展示如何声明具有固定容量的 semaphores 并设置其属性: ```java // 非公平锁, 初始计数值为3 Semaphore semaphore = new Semaphore(3); ``` 或者启用公平锁定机制: ```java // 使用公平算法, 同样设定最大并发连接数为3 Semaphore semaphoreFair = new Semaphore(3, true); ``` #### 应用场景举例——数据库连接池模拟 假设我们有一个简单的数据库连接池管理器,只允许最多三个客户端同时建立连接查询数据。此时就可以借助 semaphore 来协调这些请求。 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.concurrent.Semaphore; public class DBConnectionPool { private final int MAX_CONNECTIONS = 3; // 定义最大的连接数 private Connection[] connections; private Semaphore availableConnections; public DBConnectionPool(String url) throws SQLException { this.availableConnections = new Semaphore(MAX_CONNECTIONS); connections = new Connection[MAX_CONNECTIONS]; for (int i=0;i<MAX_CONNECTIONS;i++) { connections[i]=DriverManager.getConnection(url); } } /** * 获取数据库连接的方法. */ public Connection getConnection() throws InterruptedException{ try { availableConnections.acquire(); // 尝试获得一个许可 return getFreeConnection(); } catch (InterruptedException e){ throw e; } } private synchronized Connection getFreeConnection(){ for(Connection conn :connections ){ if(!conn.isClosed()){ return conn ; } } return null ; //理论上不会到达这里 } /** * 归还数据库连接到池子里面去. */ public void releaseConnection(Connection connection){ if(connection !=null && !connection.isClosed()) { try { connection.close(); // 关闭实际物理链接 }catch(SQLException ex){} availableConnections.release(); // 返回一个许可回semaphore } } } ``` 上述例子展示了如何利用 semaphore 控制同一时间内的活动线程数量不超过预设上限,并且保证每次只有一个线程能够成功取得空闲状态下的真实 JDBC 连接对象[^4]。 #### 总结 通过以上分析可以看出,在 Java 编程环境中运用 signal 不仅能有效解决多线程间资源共享问题,而且还能简化程序逻辑结构提高开发效率。然而需要注意的是,不当配置可能会引发死锁现象或者其他性能瓶颈等问题,因此在实际项目应用过程中应当谨慎考虑各种边界情况并做好充分测试工作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值