Thank you!
    I'm version is 7u55. and upgrade 7u60 test is ok.

jdk 1.7.0_55  test result

time:Tue Nov 11 13:24:01 CST 2014
nanoTime:18093680000
currentTime:18093
-------------------------
time:Tue Nov 11 13:24:02 CST 2014
nanoTime:19097878000
currentTime:19098
-------------------------
time:Tue Nov 11 12:24:03 CST 2014
nanoTime:-3580426662000   (negative difference)
currentTime:-3580427
-------------------------
time:Tue Nov 11 12:24:04 CST 2014
nanoTime:-3579424553000
currentTime:-3579425

jdk 1.7.0_60 test result

time:Tue Nov 11 12:28:51 CST 2014
nanoTime:8034263027
currentTime:8034
-------------------------
time:Tue Nov 11 12:28:52 CST 2014
nanoTime:9034780087
currentTime:9035
-------------------------
time:Tue Nov 11 11:28:50 CST 2014
nanoTime:10035322113  (is ok)
currentTime:-3593155
-------------------------
time:Tue Nov 11 11:28:51 CST 2014
nanoTime:11035884267
currentTime:-3592154
 


> 在 2014年11月11日,上午10:25,David Holmes <david.hol...@oracle.com> 写道:
> 
> 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.
>> 
>> —————————
>> 
>> 

Reply via email to