Possible VM deadlock due to FileSystems.getDefault and System.loadLibrary interplay

mandy chung mandy.chung at oracle.com
Thu Jan 4 22:52:45 UTC 2018



On 1/4/18 12:03 AM, Alan Bateman wrote:
> On 04/01/2018 01:35, David Holmes wrote:
>>
>> You're not missing anything. It's a class initialization related 
>> "deadlock".
>>
>> Thread A has called FileSystems.getDefault() which is doing <clinit> 
>> of DefaultFileSystemHolder, which in turn leads to 
>> Runtime.loadLibrary0 which needs to lock the Runtime instance.
>>
>> Thread B is already doing a loadLibrary and holds the Runtime lock, 
>> the loadLibrary code then needs to do FileSystems.getDefault() which 
>> has to load and initialize DefaultFileSystemHolder, but that 
>> initialization is already in progress so internally the thread does a 
>> wait().
>>
>> So Thread B is waiting for Thread A to finish initialization, but 
>> holds the monitor lock that Thread A needs to finish the 
>> initialization. Deadlock.
>>
>> AFAICS this will still be possible in 9/10/11
> Startup and initialization has changed quite a bit since JDK 8. In JDK 
> 9 the file system is initialized early (long before main). However, it 
> changes again in JDK 10 due to ongoing work to makes things lazy and 
> improve startup time. Separately, FilePermission and the JarFile 
> support have been re-written so it should be loaded before any user 
> code executes. So I think needs to be studied again, I agree with your 
> other mail to create a bug to track that.
>

This is indeed a deadlock.   I created 
https://bugs.openjdk.java.net/browse/JDK-8194653 to track this.

Mandy


More information about the core-libs-dev mailing list