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 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); } }
public final void setMaxResources(int maxResources) { resources.setPermits(maxResources); }