一个简单的BufferPool
一个简单的buffer分配和收集代码,将一大段buffer分片,外部向这个pool申请,如果全部用完,就额外分配,但不计入pool所持有的数量,外部使用完后,回收分片.
import java.nio.ByteBuffer;import java.util.concurrent.locks.ReentrantLock;public final class BufferPool { private final int chunkSize; private final ByteBuffer[] items; private final ReentrantLock lock; private int putIndex; private int takeIndex; private int count; private volatile int newCount; public BufferPool(int bufferSize, int chunkSize) { this.chunkSize = chunkSize; int capacity = bufferSize / chunkSize; capacity = (bufferSize % chunkSize == 0) ? capacity : capacity + 1; this.items = new ByteBuffer[capacity]; this.lock = new ReentrantLock(); for (int i = 0; i < capacity; i++) { insert(create(chunkSize)); } } public int capacity() { return items.length; } public int size() { return count; } public int getNewCount() { return newCount; } public ByteBuffer allocate() { ByteBuffer node = null; final ReentrantLock lock = this.lock; lock.lock(); try { node = (count == 0) ? null : extract(); } finally { lock.unlock(); } if (node == null) { ++newCount; return create(chunkSize); } else { return node; } } public void recycle(ByteBuffer buffer) { // 拒绝回收null和容量大于chunkSize的缓存 if (buffer == null || buffer.capacity() > chunkSize) { return; } final ReentrantLock lock = this.lock; lock.lock(); try { if (count != items.length) { buffer.clear(); insert(buffer); } } finally { lock.unlock(); } } private void insert(ByteBuffer buffer) { items[putIndex] = buffer; putIndex = inc(putIndex); ++count; } private ByteBuffer extract() { final ByteBuffer[] items = this.items; ByteBuffer item = items[takeIndex]; items[takeIndex] = null; takeIndex = inc(takeIndex); --count; return item; } private int inc(int i) { return (++i == items.length) ? 0 : i; } private ByteBuffer create(int size) { return ByteBuffer.allocate(size); }}