private void waitForRunningOperationsEnded() { blockAllOperations(); boolean breakAtNext = false; while (true) { Collection<LockerValue<KP>> values = locker.getMapKeyLockToValueLock().values(); int waitingThreads = 0; for (LockerValue<KP> lockerValue : values) { waitingThreads += lockerValue.getLock().getQueueLength(); } if (runningOperations.get() - waitingThreads <= 0) { if (breakAtNext) { break; } breakAtNext = true; } else { breakAtNext = false; } try { Thread.sleep(10); } catch (InterruptedException e) { break; } } }