private boolean blockForExit(CountDownLatch[] arr) { synchronized (NbLifecycleManager.class) { if (onExit != null) { arr[0] = onExit; LOG.log(Level.FINE, "blockForExit, already counting down {0}", onExit); return true; } arr[0] = onExit = new CountDownLatch(1) { @Override public void countDown() { super.countDown(); SecondaryLoop d = sndLoop; LOG.log(Level.FINE, "countDown for {0}, hiding {1}, by {2}", new Object[] { this, d, Thread.currentThread() } ); if (d != null) { while (!d.exit()) { LOG.log(Level.FINE, "exit before enter, try again"); } } } }; LOG.log(Level.FINE, "blockForExit, new {0}", onExit); return false; } }