diff --git a/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java index 72385dfc..d78b89c6 100644 --- a/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java +++ b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java @@ -124,27 +124,22 @@ public class ConcurrentBag implements AutoCloseab final long startScan = System.nanoTime(); final long originTimeout = timeout; long startSeq; - try { + do { do { - do { - startSeq = synchronizer.currentSequence(); - for (final T bagEntry : sharedList) { - if (bagEntry.state().compareAndSet(STATE_NOT_IN_USE, STATE_IN_USE)) { - return bagEntry; - } + startSeq = synchronizer.currentSequence(); + for (final T bagEntry : sharedList) { + if (bagEntry.state().compareAndSet(STATE_NOT_IN_USE, STATE_IN_USE)) { + return bagEntry; } - } while (startSeq < synchronizer.currentSequence()); - - if (addItemFuture == null || addItemFuture.isDone()) { - addItemFuture = listener.addBagItem(); } - - timeout = originTimeout - (System.nanoTime() - startScan); - } while (timeout > 1000L && synchronizer.waitUntilSequenceExceeded(startSeq, timeout)); - } - finally { - synchronizer.signal(); - } + } while (startSeq < synchronizer.currentSequence()); + + if (addItemFuture == null || addItemFuture.isDone()) { + addItemFuture = listener.addBagItem(); + } + + timeout = originTimeout - (System.nanoTime() - startScan); + } while (timeout > 1000L && synchronizer.waitUntilSequenceExceeded(startSeq, timeout)); return null; }