remainingcapacity() 返回队列剩余容量,即 capacity - size(),是线程安全的快照值,仅反映当前已存元素数,不考虑等待中的插入操作,适用于监控统计而非原子插入决策。

ArrayBlockingQueue 的 remainingCapacity() 方法返回当前队列还能容纳多少个元素,即“剩余容量”。它不是实时计算的空闲槽位数,而是基于队列的固定容量和当前元素个数直接相减得出的结果。
remainingCapacity() 的计算逻辑
该方法本质是:capacity - size()。由于 ArrayBlockingQueue 是有界队列,构造时指定的容量不可变,所以 remainingCapacity 始终等于总容量减去当前已存元素数量。
- 即使队列中存在被阻塞等待出队的线程,也不影响该值——它只看当前实际存储的元素个数
- 当队列满时(size == capacity),返回 0;为空时,返回 capacity
- 该方法是线程安全的,内部通过锁保障读取 size 和 capacity 的一致性
与 offer() / put() 的配合使用场景
remainingCapacity() 常用于**预判是否能插入而不阻塞或失败**,但要注意:它只是快照值,不能替代原子操作。
- 想非阻塞插入?直接用 offer(e) 更可靠——它返回 boolean 表示是否成功,且是原子的
- 想阻塞插入?直接用 put(e),无需提前查 remainingCapacity
- 仅在需要“估算冗余空间”或做监控统计(如打印当前负载率)时,才适合调用 remainingCapacity()
一个易错点:它不反映等待中的操作
假设队列容量为 10,当前有 9 个元素,此时 remainingCapacity() 返回 1。但如果此时已有线程在调用 put() 并被挂起(等待空间),这个等待中的插入不会体现在 size() 中,也不会被 remainingCapacity() 感知——它仍返回 1。也就是说,remainingCapacity 只反映当前状态,不预测未来竞争。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











