本文目录导读:

Java标准库中没有直接提供一个名为“环形缓冲区”(Ring Buffer / Circular Buffer)的专用类,Java提供了多种方式来实现或使用环形缓冲区的功能,具体取决于你的需求。
Java标准库中的替代方案
ArrayBlockingQueue(最接近的官方实现)
java.util.concurrent.ArrayBlockingQueue 本质上就是一个有界、线程安全的环形缓冲区。
import java.util.concurrent.ArrayBlockingQueue;
// 创建一个容量为10的环形缓冲区
ArrayBlockingQueue<String> ringBuffer = new ArrayBlockingQueue<>(10);
// 写入数据(如果满了会阻塞或抛出异常)
ringBuffer.put("data"); // 阻塞写入
ringBuffer.offer("data"); // 非阻塞写入,返回boolean
// 读取数据
String data = ringBuffer.take(); // 阻塞读取
String data = ringBuffer.poll(); // 非阻塞读取
特点:线程安全、阻塞操作、FIFO顺序
LinkedBlockingQueue
也可以用作有界队列,但内部是链表结构,不是严格意义上的环形缓冲区。
ConcurrentLinkedDeque / ArrayDeque
非线程安全的双端队列,可以用来实现自定义的环形缓冲区。
第三方库
Netty 的 RingBuffer
Netty 框架提供了高性能的环形缓冲区实现:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-buffer</artifactId>
</dependency>
LMAX Disruptor
专为高性能场景设计的无锁环形缓冲区:
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.4</version>
</dependency>
手动实现简单环形缓冲区
如果只是需要基础功能,可以自己实现:
public class CircularBuffer<T> {
private final T[] buffer;
private int head = 0;
private int tail = 0;
private int size = 0;
private final int capacity;
@SuppressWarnings("unchecked")
public CircularBuffer(int capacity) {
this.capacity = capacity;
buffer = (T[]) new Object[capacity];
}
public boolean offer(T element) {
if (isFull()) return false;
buffer[tail] = element;
tail = (tail + 1) % capacity;
size++;
return true;
}
public T poll() {
if (isEmpty()) return null;
T element = buffer[head];
head = (head + 1) % capacity;
size--;
return element;
}
public boolean isFull() { return size == capacity; }
public boolean isEmpty() { return size == 0; }
public int size() { return size; }
}
选择建议
| 场景 | 推荐方案 |
|---|---|
| 简单的生产者-消费者模型 | ArrayBlockingQueue |
| 高并发、低延迟 | LMAX Disruptor |
| 网络编程 | Netty RingBuffer |
| 特定需求,自定义逻辑 | 手动实现 |
Java没有专门的"环形缓冲区API",但ArrayBlockingQueue 是最接近标准库实现的选择,而LMAX Disruptor 是高性能场景的工业级解决方案。