Skip to content

Instantly share code, notes, and snippets.

@vchernyshov
Created October 31, 2017 09:25
Show Gist options
  • Save vchernyshov/168bb89ac74f805614ebb9c97dcc8945 to your computer and use it in GitHub Desktop.
Save vchernyshov/168bb89ac74f805614ebb9c97dcc8945 to your computer and use it in GitHub Desktop.
public class ObjectPool<T> {
private final Object poolSync = new Object();
private SparseArray<T> freePool;
private SparseArray<T> lentPool;
private PooledObjectCreator<T> objectCreator;
public ObjectPool(int initialCapacity, PooledObjectCreator<T> objectCreator) {
this.objectCreator = objectCreator;
initialize(initialCapacity);
}
@NonNull
public final T acquire() {
T t;
synchronized (poolSync) {
int freeSize = freePool.size();
for (int i = 0; i < freeSize; i++) {
int key = freePool.keyAt(i);
t = freePool.get(key);
if (t != null) {
this.lentPool.put(key, t);
this.freePool.remove(key);
return t;
}
}
t = objectCreator.create();
lentPool.put(lentPool.size() + freeSize, t);
}
return t;
}
public final void release(@Nullable T t) {
if (t == null) {
return;
}
synchronized (poolSync) {
int key = lentPool.indexOfValue(t);
objectCreator.restore(t);
this.freePool.put(key, t);
this.lentPool.remove(key);
}
}
private void initialize(final int initialCapacity) {
lentPool = new SparseArray<>(initialCapacity);
freePool = new SparseArray<>(initialCapacity);
for (int i = 0; i < initialCapacity; i++) {
freePool.put(i, objectCreator.create());
}
}
public interface PooledObjectCreator<T> {
@NonNull
T create();
void restore(@NonNull T object);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment