数组实现连接池状态标记的核心是将数组作为状态寄存器:下标对应资源,值表示状态;布尔数组适合二态(空闲/占用),整型数组支持多态与元信息编码,需配合同步机制防竞争。

用数组实现连接池状态标记,核心是把数组当作“状态寄存器”:每个下标对应一个资源(如数据库连接、线程、缓存块),值表示其当前状态(空闲/占用/销毁中)。它轻量、索引快、内存连续,特别适合固定规模、高频状态切换的场景。
用布尔数组做基础状态标记
最简方式是用 boolean[] 表示连接是否被占用。初始化时全为 false(空闲),获取时找第一个 false 位设为 true,归还时再置回 false。
- 优点:内存省(1字节/元素)、判断和切换都是 O(1)
- 注意:需配合同步机制(如 ReentrantLock 或 AtomicInteger.compareAndSet)避免多线程竞争导致重复分配
- 示例:10个连接的池,
boolean[] inUse = new boolean[10];分配时循环扫描,或用AtomicInteger cursor做简单轮询(适合低冲突场景)
用整型数组支持多状态与生命周期计数
当需要区分“空闲”“使用中”“正在关闭”“已失效”等状态,或记录某连接被复用次数、最后使用时间戳,可用 int[] 或 long[]。每个值编码状态+元信息,例如:
-
0→ 空闲;1→ 占用;-1→ 关闭中;-2→ 已失效 - 或高位存状态(如
status ),低位存计数(如 <code>counter & 0xFFFFFF),用位运算分离 - 实战中可搭配
volatile int[] states保证可见性,避免加锁读状态
结合引用数组管理变量存活(软/弱引用防泄漏)
若池中对象本身(如 Connection 实例)需要自动回收,不能仅靠状态数组——要防止强引用阻止 GC。此时可将状态数组与引用数组协同:
- 声明
Reference<connection>[] refs = new SoftReference[n]</connection>,状态数组int[] status独立存在 - 分配时:先查
status[i] == 0,再refs[i].get()检查是否还存活;若为 null,标记status[i] = -2并跳过 - 归还前:检查
refs[i].get() != null,再设status[i] = 0;若已回收,直接丢弃,后续由清理线程重建 - 这样既利用数组快速定位,又靠引用类型让 JVM 控制真实对象生命周期
实战小技巧:用原子数组替代锁,兼顾性能与安全
Java 9+ 提供 AtomicIntegerArray 和 AtomicReferenceArray,比手动 synchronized 更高效:
- 分配连接:
int i = findFreeIndex(); if (states.compareAndSet(i, 0, 1)) { return refs.get(i); } - 归还连接:
if (states.get(i) == 1) states.set(i, 0);(可加 CAS 循环确保成功) - 清理失效连接:遍历
states找-2位,用refs.compareAndSet(i, oldRef, newRef)替换
不复杂但容易忽略:状态变更和引用操作必须成对出现,且关键路径避免在锁内做 I/O 或耗时操作。










