JDK-8217884 : File system iniitialization deadlock
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.lang:class_loading
  • Priority: P2
  • Status: Closed
  • Resolution: Duplicate
  • Submitted: 2019-01-28
  • Updated: 2019-01-28
  • Resolved: 2019-01-28
Related Reports
Duplicate :  
Description
There appears to be a classic lock-order deadlock when two threads call System.loadLibrary and FileSystems.getDefault to invoke class initialization.

---
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import static java.util.concurrent.TimeUnit.SECONDS;

public class Repro {

    static sun.security.ec.SunEC newSunEC() {
        return new sun.security.ec.SunEC();
    }

    static void getDefaultFileSystem() {
        java.nio.file.FileSystems.getDefault();
    }

    public static void main(String[] args) throws Throwable {
        ExecutorService ex1 = Executors.newSingleThreadExecutor();
        ExecutorService ex2 = Executors.newSingleThreadExecutor();

        Future<?> future1 = ex1.submit(Repro::newSunEC);
        Future<?> future2 = ex2.submit(Repro::getDefaultFileSystem);

        future1.get();
        future2.get();

        ex1.shutdown();
        ex2.shutdown();

        ex1.awaitTermination(Long.MAX_VALUE, SECONDS);
        ex2.awaitTermination(Long.MAX_VALUE, SECONDS);
    }
}
---

When I run this program repeatedly with jdk8, I (eventually) see this deadlock:


"pool-2-thread-1" #10 prio=5 os_prio=0 tid=0x00007f55c81c0000 nid=0x47e waiting for monitor entry [0x00007f55b3319000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at java.lang.Runtime.loadLibrary0(Runtime.java:862)
	- waiting to lock <0x000000076cf9a060> (a java.lang.Runtime)
	at java.lang.System.loadLibrary(System.java:1122)
	at sun.nio.fs.UnixNativeDispatcher$1.run(UnixNativeDispatcher.java:573)
	at sun.nio.fs.UnixNativeDispatcher$1.run(UnixNativeDispatcher.java:571)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.nio.fs.UnixNativeDispatcher.<clinit>(UnixNativeDispatcher.java:571)
	at sun.nio.fs.UnixFileSystem.<init>(UnixFileSystem.java:67)
	at sun.nio.fs.LinuxFileSystem.<init>(LinuxFileSystem.java:39)
	at sun.nio.fs.LinuxFileSystemProvider.newFileSystem(LinuxFileSystemProvider.java:46)
	at sun.nio.fs.LinuxFileSystemProvider.newFileSystem(LinuxFileSystemProvider.java:39)
	at sun.nio.fs.UnixFileSystemProvider.<init>(UnixFileSystemProvider.java:56)
	at sun.nio.fs.LinuxFileSystemProvider.<init>(LinuxFileSystemProvider.java:41)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at java.lang.Class.newInstance(Class.java:442)
	at sun.nio.fs.DefaultFileSystemProvider.createProvider(DefaultFileSystemProvider.java:48)
	at sun.nio.fs.DefaultFileSystemProvider.create(DefaultFileSystemProvider.java:63)
	at java.nio.file.FileSystems$DefaultFileSystemHolder.getDefaultProvider(FileSystems.java:108)
	at java.nio.file.FileSystems$DefaultFileSystemHolder.access$000(FileSystems.java:89)
	at java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(FileSystems.java:98)
	at java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(FileSystems.java:96)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.nio.file.FileSystems$DefaultFileSystemHolder.defaultFileSystem(FileSystems.java:96)
	at java.nio.file.FileSystems$DefaultFileSystemHolder.<clinit>(FileSystems.java:90)
	at java.nio.file.FileSystems.getDefault(FileSystems.java:176)
	at Repro.getDefaultFileSystem(Repro.java:13)
	at Repro$$Lambda$2/1023892928.run(Unknown Source)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

"pool-1-thread-1" #9 prio=5 os_prio=0 tid=0x00007f55c81be000 nid=0x47d in Object.wait() [0x00007f55b341c000]
   java.lang.Thread.State: RUNNABLE
	at java.nio.file.FileSystems.getDefault(FileSystems.java:176)
	at java.nio.file.Paths.get(Paths.java:138)
	at sun.misc.Launcher$ExtClassLoader.findLibrary(Launcher.java:235)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1830)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	- locked <0x000000076cf9a060> (a java.lang.Runtime)
	at java.lang.System.loadLibrary(System.java:1122)
	at sun.security.ec.SunEC$1.run(SunEC.java:60)
	at sun.security.ec.SunEC$1.run(SunEC.java:58)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.security.ec.SunEC.<clinit>(SunEC.java:58)
	at Repro.newSunEC(Repro.java:9)
	at Repro$$Lambda$1/2003749087.call(Unknown Source)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

"main" #1 prio=5 os_prio=0 tid=0x00007f55c800a800 nid=0x46e waiting on condition [0x00007f55d168d000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x000000076d33c320> (a java.util.concurrent.FutureTask)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:429)
	at java.util.concurrent.FutureTask.get(FutureTask.java:191)
	at Repro.main(Repro.java:23)


Comments
I agree with Alan this is a dup. (I should have done a better JIRA search)
28-01-2019

This may be a duplicate of JDK-8194653.
28-01-2019