分析一下,最简单的连接池要有什么?
属性的话需要有连接数,以及连接数组,以及连接状态(代表当前连接是否被用)。以及一个全局状态(保证线程安全)。
方法的话,获取连接(多线程),以及释放连接(单线程)。
以及相关的构造函数。
package com.bo.threadstudy.seven;
import lombok.extern.slf4j.Slf4j;
import java.sql.*;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicIntegerArray;
/**
* 定义一个连接池,这个连接池需要有有一个线程安全的队列来维护,在多线程有存放和取连接的过程
* 而且得标记哪个连接被取了,被取的连接是不能被拿走的
* 属性,Conntion数组,AtomicIntegerArray(每个连接的状态,我最开始想的是Conntion作为Atomic,虽然性,但是没有状态),连接数
* 定义的方法,取连接,放连接
*/
@Slf4j
public class ConnectionPoolTest {
public static void main(String[] args) {
ConnectionPool connectionPool = new ConnectionPool(1);
new Thread(() -> {
Connection connection = connectionPool.getConnection();
connectionPool.releaseConnection(connection);
}).start();
new Thread(() -> {
Connection connection = connectionPool.getConnection();
connectionPool.releaseConnection(connection);
}).start();
}
}
@Slf4j
class ConnectionPool {
//连接对象
private Connection[] connections;
//连接池的状态,0代表未使用,1代表已使用
private AtomicIntegerArray statusList;
//连接池的数量
private Integer poolSize;
private final int unusedStatus = 0;
private final int usedStatus = 1;
//根据happen-before原则中的lock原则,不需要加volatile,可以保证可见
private int globalStatus = 0;
//创建对象这个过程肯定是单线程操作
ConnectionPool(int poolSize) {
this.poolSize = poolSize;
statusList = new AtomicIntegerArray(poolSize);
connections = new Connection[poolSize];
for (int i = 0; i < poolSize; i++) {
connections[i] = new MockConnection();
statusList.set(i, unus