首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

一个容易的BufferPool

2012-12-21 
一个简单的BufferPool一个简单的buffer分配和收集代码,将一大段buffer分片,外部向这个pool申请,如果全部用

一个简单的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);    }}

热点排行