在编程语境中,所谓“有界”(Bounded)通常是指某个数据结构、缓冲区或资源被限定了最大容量,不能无限制地增长。与之相对的是“无界”,即理论上可以一直扩容直到系统资源耗尽。在并发编程里,有界机制常被用来保护系统稳定性,避免生产者疯狂写入而导致内存溢出或线程调度恶化。

一、什么是有界
有界本质上就是给某个容器或行为加上一道上限。例如一个集合最多放 10 个元素,那就是有界集合;一个线程池最多同时跑 8 个线程,那也是有界资源。在代码层面,我们常用容量参数来体现这种边界:
// 创建一个有界阻塞队列,容量上限为 100 BlockingQueue<Task> queue = new ArrayBlockingQueue<>(100);
上面的 ArrayBlockingQueue 在构造时传入了 100,表示队列中最多容纳 100 个任务,这就是典型的有界结构。
二、并发编程中的有界应用
1. 有界阻塞队列实现背压
在多线程生产者消费者模型中,如果队列无界,生产者可能持续放入任务,而消费者处理较慢,最终引发 OutOfMemoryError。使用有界队列后,当队列满时,生产者线程会被阻塞(或在超时后丢弃),从而自然形成背压:
ExecutorService consumer = Executors.newFixedThreadPool(4); BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(50); // 当队列满时,生产者调用 put 会阻塞 workQueue.put(() -> consumer.submit(new Job()));
2. 有界线程池控制并发度
线程本身也是昂贵资源,因此有界线程池能防止过多线程争抢 CPU。下面表格对比了有界与无界线程池的特点:
| 类型 | 最大线程数 | 风险 |
|---|---|---|
| 有界线程池 | 固定或受限 | 任务可能排队或拒绝 |
| 无界线程池 | 理论上无限 | 耗尽系统线程与内存 |
3. 有界信号量限制访问量
除了队列和线程池,Semaphore 也是常见有界工具,它限制同时访问某资源的线程数:
// 最多允许 3 个线程同时访问
Semaphore sem = new Semaphore(3);
sem.acquire(); // 超过 3 个则阻塞
try {
doLimitedWork();
} finally {
sem.release();
}
三、总结
理解“有界”的含义,核心就是认清“上限”二字。在并发编程中,合理运用有界队列、有界线程池和有界信号量,可以有效控制资源使用、实现背压并提升系统健壮性。写多线程代码时,应优先思考是否该给资源加上边界。