RFR: 8305092: Improve Thread.sleep(millis, nanos) for sub-millisecond granularity [v12]
Aleksey Shipilev
shade at openjdk.org
Wed Apr 26 20:22:54 UTC 2023
> Java API has the `Thread.sleep(millis, nanos)` method exposed to users. The documentation for that method clearly says the precision and accuracy are dependent on the underlying system behavior. However, it always rounds up `nanos` to 1ms when doing the actual sleep. This means users cannot do the micro-second precision sleeps, even when the underlying platform allows it. Sub-millisecond sleeps are useful to build interesting primitives, like the rate limiters that run with >1000 RPS.
>
> When faced with this, some users reach for more awkward APIs like `java.util.concurrent.locks.LockSupport.parkNanos`. The use of that API for sleeps is not in line with its intent, and while it "seems to work", it might have interesting interactions with other uses of `LockSupport`. Additionally, these "sleeps" are no longer visible to monitoring tools as "normal sleeps", e.g. as `Thread.sleep` events. Therefore, it would be prudent to improve current `Thread.sleep(millis, nanos)` for sub-millisecond granularity.
>
> Fortunately, the underlying code is almost ready for this, at least on POSIX side. I skipped Windows paths, because its timers are still no good. Note that on both Linux and MacOS timers oversleep by about 50us. I have a few ideas how to improve the accuracy for them, which would be a topic for a separate PR.
>
> Additional testing:
> - [x] New regression test
> - [x] New benchmark
> - [x] Linux x86_64 `tier1`
> - [x] Linux AArch64 `tier1`
Aleksey Shipilev has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 26 commits:
- Merge branch 'master' into JDK-83050920-thread-sleep-subms
- Merge branch 'master' into JDK-83050920-thread-sleep-subms
- Fix Amazon copyright
- Merge branch 'master' into JDK-83050920-thread-sleep-subms
- Drop nanos_to_nanos_bounded
- Handle overflows
- More review comments
- Adjust test times
- Windows again
- Windows fixes: align(...) is only for power-of-two alignments
- ... and 16 more: https://git.openjdk.org/jdk/compare/35e7bc21...da8f0f8c
-------------
Changes: https://git.openjdk.org/jdk/pull/13225/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=13225&range=11
Stats: 254 lines in 11 files changed: 226 ins; 9 del; 19 mod
Patch: https://git.openjdk.org/jdk/pull/13225.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/13225/head:pull/13225
PR: https://git.openjdk.org/jdk/pull/13225
More information about the core-libs-dev
mailing list