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.

—————————


Reply via email to