@Override
    public void doWithBufferPair(final int minKeyCapacity,
                                 final int minValueCapacity,
                                 final BiConsumer<ByteBuffer, ByteBuffer> work) {
        ByteBuffer keyBuffer = null;
        ByteBuffer valueBuffer = null;
        try {
            keyBuffer = getBuffer(minKeyCapacity);
            valueBuffer = getBuffer(minValueCapacity);
            work.accept(keyBuffer, valueBuffer);
        } finally {
            if (keyBuffer != null) {
                release(keyBuffer);
            }
            if (valueBuffer != null) {
                release(valueBuffer);
            }
        }
    }
An bounded self-populating pool of directly allocated ByteBuffers.
The pool holds buffers in a fixed set of sizes and any request for a buffer
will result in a buffer with capacity >= the requested capacity being
returned.
All buffers are cleared ready for use when obtained from the pool.
Once a buffer has been returned to the pool it MUST not be used else
bad things will happen.
<p>
This impl uses lock free {@link ConcurrentLinkedQueue} and {@link Semaphore}
stroom-bytebuffer/src/main/java/stroom/bytebuffer/ByteBufferPoolImpl5.java