package droidkit.util; import android.support.annotation.NonNull; import java.util.ArrayDeque; import java.util.Deque; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @author Daniel Serdyukov */ public abstract class ObjectPool<T> { private final ReentrantReadWriteLock mLock = new ReentrantReadWriteLock(); private final Deque<T> mDeque = new ArrayDeque<>(); public T obtain() { final ReentrantReadWriteLock.ReadLock lock = mLock.readLock(); lock.lock(); try { return obtainNonBlock(); } finally { lock.unlock(); } } public T obtainNonBlock() { final T object = mDeque.pollLast(); if (object == null) { return newEntry(); } return object; } public void release(@NonNull T entry) { final ReentrantReadWriteLock.WriteLock lock = mLock.writeLock(); lock.lock(); try { releaseNonBlock(entry); } finally { lock.unlock(); } } public void releaseNonBlock(@NonNull T entry) { mDeque.offerLast(entry); } @NonNull protected abstract T newEntry(); }