Hm, how did you change the time? (normal date command?) System.nanoTime is supposed to be monotonic. I think on linux it even uses a timer for exactly that.
i think there was a open bug around park(), but the nanoTime should be find (and negative difference are sonewhat normal with it anyway) gruss bernd -- http://bernd.eckenfels.net ----- Ursprüngliche Nachricht ----- Von: "wuwen.55" <wuwen...@gmail.com> Gesendet: 10.11.2014 19:54 An: "core-libs-dev@openjdk.java.net" <core-libs-dev@openjdk.java.net> Betreff: Java CountDownLatch.await(timeout) is influenced by changes to Systemtime on Linux call .await(10, TimeUnit.SECONDS) and change the time one hours back. i.e. start at 13:00 call .await and at 13:05 change the time to 12:05 you will notice that the wait does not return. when change the time to the current time . change the time to 13:05. the wait still does not return. test code: CountDownLatch c = new CountDownLatch(1); ... c.await(10, TimeUnit.SECONDS); ... ---------------------------------- AbstractQueuedSynchronizer.doAcquireNanos long lastTime = System.nanoTime(); final Node node = addWaiter(Node.EXCLUSIVE); boolean failed = true; try { for (;;) { final Node p = node.predecessor(); if (p == head && tryAcquire(arg)) { setHead(node); p.next = null; // help GC failed = false; return true; } if (nanosTimeout <= 0) return false; if (shouldParkAfterFailedAcquire(p, node) && nanosTimeout > spinForTimeoutThreshold) LockSupport.parkNanos(this, nanosTimeout); long now = System.nanoTime(); nanosTimeout -= now - lastTime; lastTime = now; if (Thread.interrupted()) throw new InterruptedException(); } } finally { if (failed) cancelAcquire(node); } when change the time one hours back now - lastTime is negative number. —————————