public final R acquire() { Thread thread = Thread.currentThread(); R resource = current.get(thread); if (resource == null) { resources.acquireUninterruptibly(); List<R> garbage = null; synchronized (unused) { for (; ; ) { resource = unused.poll(); if (resource == null) break; if (isAlive(resource)) break; if (garbage == null) garbage = new LinkedList<R>(); garbage.add(resource); } } if (resource == null) { resource = create(); } current.put(thread, resource); if (garbage != null) { for (R dead : garbage) { dispose(dead); } } } return resource; }
public final void close(boolean force) { List<R> dead = new LinkedList<R>(); synchronized (unused) { dead.addAll(unused); unused.clear(); maxUnused = 0; } if (force) dead.addAll(current.values()); for (R resource : dead) { dispose(resource); } }
public final void release() { Thread thread = Thread.currentThread(); R resource = current.remove(thread); if (resource != null) { boolean dead = false; synchronized (unused) { if (unused.size() < maxUnused) { unused.add(resource); } else { dead = true; } } resources.release(); if (dead) dispose(resource); } }