in src/main/java/org/apache/commons/pool3/impl/GenericKeyedObjectPool.java [1396:1427]
private ObjectDeque<T> register(final K k) {
Lock lock = keyLock.readLock();
ObjectDeque<T> objectDeque = null;
try {
lock.lock();
objectDeque = poolMap.get(k);
if (objectDeque == null) {
// Upgrade to write lock
lock.unlock();
lock = keyLock.writeLock();
lock.lock();
final AtomicBoolean allocated = new AtomicBoolean();
objectDeque = poolMap.computeIfAbsent(k, key -> {
allocated.set(true);
final ObjectDeque<T> deque = new ObjectDeque<>(fairness);
deque.getNumInterested().incrementAndGet();
// NOTE: Keys must always be added to both poolMap and
// poolKeyList at the same time while protected by
poolKeyList.add(k);
return deque;
});
if (!allocated.get()) {
objectDeque.getNumInterested().incrementAndGet();
}
} else {
objectDeque.getNumInterested().incrementAndGet();
}
} finally {
lock.unlock();
}
return objectDeque;
}