RFR: 8305092: Improve Thread.sleep(millis, nanos) for sub-millisecond granularity

Aleksey Shipilev shade at openjdk.org
Wed Mar 29 17:20:32 UTC 2023


On Wed, 29 Mar 2023 16:48:41 GMT, David M. Lloyd <duke at openjdk.org> wrote:

> Are there specific factors which would make it unreasonable to implement `sleep` in terms of `parkNanos`?

After reading the Javadoc for `LockSupport`, I don't believe implementing `Thread.sleep` with `LockSupport.parkNanos` is a proper thing to do. `LockSupport` implicitly deals with permits, acting like a single-permit semaphore. So the behavior for `parkNanos` when there is a prior `LockSupport.unpark` (which adds the permit) is to consume the permit and return immediately.

In other words:


% cat LockSupportIsNotSleep.java 
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.TimeUnit;

public class LockSupportIsNotSleep {
   public static void main(String... args) {
      LockSupport.unpark(Thread.currentThread());

      long time1 = System.nanoTime();
      LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1000));
      long time2 = System.nanoTime();

      System.out.println("Slept for " + (time2 - time1) + " ns");
   }
}

% java LockSupportIsNotSleep.java                   
Slept for 6583 ns

-------------

PR Comment: https://git.openjdk.org/jdk/pull/13225#issuecomment-1489000794


More information about the core-libs-dev mailing list