package cn.itcast.Demo21.JUC;
import java.util.concurrent.Semaphore;
public class ConnectPool {
// 连接池大小
private int size;
// 数据库连接集合
private Connect[] connects;
// 数据库连接状态
private boolean[] connectFlag;
// 剩余可用连接
private volatile int available;
// 信号量
private Semaphore semaphore;
public static class Connect{
}
// 构造器
public ConnectPool(int size){
this.size = size;
this.available = size;
semaphore = new Semaphore(size, true);
connects = new Connect[size];
connectFlag = new boolean[size];
initConnects();
}
// 初始化连接,生成指定数量的数据库连接集合
private void initConnects(){
for (int i = 0; i < this.size; i++) {
connects[i] = new Connect();
}
}
// 获取数据库连接
private synchronized Connect getConnect(){
for (int i = 0; i < connectFlag.length; i++) {
if (!connectFlag[i]){
connectFlag[i] = true;
available--;
return connects[i];
}
}
return null;
}
// 获取一个连接
public Connect openConnect() throws InterruptedException{
// 获取连接许可证
semaphore.acquire();
return getConnect();
}
// 释放一个连接
public synchronized void release(Connect connect){
for (int i = 0; i < this.size; i++) {
if (connect == connects[i]){
connectFlag[i] = false;
available++;
semaphore.release();
}
}
}
// 获取剩余可用连接数
public int getAvailable(){
return available;
}
}
Semaphore(信号量)实现应用
最新推荐文章于 2024-06-22 16:11:28 发布