package com.bumptech.glide.util; import android.util.Log; import java.util.LinkedList; import java.util.Queue; public class ByteArrayPool { private static final String TAG = "ByteArrayPool"; // 64 KB. private static final int TEMP_BYTES_SIZE = 64 * 1024; // 512 KB. private static final int MAX_SIZE = 512 * 1024; private static final int MAX_BYTE_ARRAY_COUNT = MAX_SIZE / TEMP_BYTES_SIZE; private final Queue<byte[]> tempQueue = new LinkedList<byte[]>(); private static final ByteArrayPool BYTE_ARRAY_POOL = new ByteArrayPool(); public static ByteArrayPool get() { return BYTE_ARRAY_POOL; } private ByteArrayPool() { } public void clear() { synchronized (tempQueue) { tempQueue.clear(); } } public byte[] getBytes() { byte[] result; synchronized (tempQueue) { result = tempQueue.poll(); } if (result == null) { result = new byte[TEMP_BYTES_SIZE]; if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "Created temp bytes"); } } return result; } public boolean releaseBytes(byte[] bytes) { if (bytes.length != TEMP_BYTES_SIZE) { return false; } boolean accepted = false; synchronized (tempQueue) { if (tempQueue.size() < MAX_BYTE_ARRAY_COUNT) { accepted = true; tempQueue.offer(bytes); } } return accepted; } }