Как правило, вы используете комбинацию ThreadLocal и SoftReference. Бывший, чтобы упростить синхронизацию (устранить необходимость в ней, по существу); и последнее, чтобы сделать буфер перезагружаемым, если не хватает памяти (учитывая другие комментарии относительно проблем GC с прямыми буферами). На самом деле все довольно просто: проверьте, есть ли у SoftReference буфер с достаточно большим размером; если нет, выделите; если да, четкая ссылка. Как только вы закончите с этим, переустановите ссылку, чтобы указать на буфер.
Другой вопрос - нужен ли ByteBuffer по сравнению с обычным байтом []. Многие разработчики предполагают, что ByteBuffers лучше с точки зрения производительности, но это предположение обычно не подтверждается фактическими данными (т. Е. Тестированием, чтобы увидеть, есть ли разница в производительности и в каком направлении). Причина, по которой byte [] часто может быть быстрее, заключается в том, что доступ к нему может быть проще, а HotSpot - эффективнее JIT.