try {
if (!sem.tryAcquire(maxWaitMillis, TimeUnit.MILLISECONDS))
throw new OLockException("No more resources available in pool. Requested resource: " + key);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new OInterruptedException(e);
}
V res;
do {
// POP A RESOURCE