线程学习(28)-连接池

分析一下,最简单的连接池要有什么?

属性的话需要有连接数,以及连接数组,以及连接状态(代表当前连接是否被用)。以及一个全局状态(保证线程安全)。

方法的话,获取连接(多线程),以及释放连接(单线程)。

以及相关的构造函数。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值