OpenJDK8 Thread.sleep will deadlock while turn down system date time.

Daniel Eischen deischen at freebsd.org
Wed Apr 12 00:03:06 UTC 2017


On Tue, 11 Apr 2017, Eric van Gyzen wrote:

> On 4/8/17 2:03 AM, Konstantin Belousov wrote:
[ ... ]
>> 
>> If JVM sets timeouts using absolute times than it might be fixed in latest
>> HEAD and stable/11.
>
> The JVM uses pthread_cond_timedwait() to implement Thread.sleep(), so it 
> always uses absolute times.  Furthermore, it uses the default clock, 
> CLOCK_REALTIME.  My recent change (r315280) does not fix this behavior; in 
> fact, I believe it will make the problem worse, since moving the clock 
> forward will wake the thread prematurely.
>
> I think the JVM should be fixed to use CLOCK_MONOTONIC.  Would someone like 
> to do the research to determine the correct behavior of Thread.sleep()? 
> Specifically, should the duration of the sleep be affected by adjustments to 
> the real-time clock?  I expect that it should /not/ be affected, especially 
> since the API takes a relative/interval time.  Ideally, we would find the 
> answer in the formal language specification; failing that, I would be 
> satisfied with empirical data from testing on Windows, Linux, MacOS, and 
> Solaris.  I'll be happy to write a patch once we know what it should do.
>
> Please keep me CC'd, since I'm not on freebsd-java at .  (Thanks for the CC, 
> Kostik.)

It seems CLOCK_REALTIME behavior has bugged Linux in the past, too.  I
think using CLOCK_MONOTONIC, perhaps via pthread_condattr_setclock() in
our JVM, would be the better approach.  You'd probably also want to
check that whatever java.util.concurrent relies on, if different, also
behaves similarly (monotonically).

-- 
DE


More information about the freebsd-java mailing list