Java CountDownLatch.await(timeout) is influenced by changes to System time on Linux

David Holmes david.holmes at oracle.com
Tue Nov 11 02:25:44 UTC 2014


Repeating my response due to the subject mangling in the other "thread":

This is a known issue:

https://bugs.openjdk.java.net/browse/JDK-6900441

fixed in 7u60, 8 and 9.

What version were you running?

David

On 7/11/2014 6:22 PM, wuwen.55 wrote:
> 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.
>
> —————————
>
>



More information about the core-libs-dev mailing list