I have observed a dead lock in class initialization, if two threads try to initialize a COM-Connection. My analysis is based on version 4.1.0. I have observed some bigger delay (~6s) in Thread-1 before the lock, while the Application is found in the RunningObjectTable. This is because of doors, which delays until the login is shown, but register in the ROT before.
Thread-1 is in Native.loadLibraryInstance with lock on libraries but waits for DISPPARAMS containing class OleAuto:
sun.misc.Unsafe.ensureClassInitialized(Class) Unsafe.java (native)
sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(Field, boolean) UnsafeFieldAccessorFactory.java:43
sun.reflect.ReflectionFactory.newFieldAccessor(Field, boolean) ReflectionFactory.java:140
java.lang.reflect.Field.acquireFieldAccessor(boolean) Field.java:1057
java.lang.reflect.Field.getFieldAccessor(Object) Field.java:1038
java.lang.reflect.Field.get(Object) Field.java:379
com.sun.jna.Native.loadLibraryInstance(Class) Native.java:447
com.sun.jna.Native.getLibraryOptions(Class) Native.java:508
com.sun.jna.Native.getStructureAlignment(Class) Native.java:596
com.sun.jna.Structure.setAlignType(int) Structure.java:251
com.sun.jna.Structure.(Pointer, int, TypeMapper) Structure.java:176
com.sun.jna.Structure.(Pointer, int) Structure.java:172
com.sun.jna.Structure.(int) Structure.java:159
com.sun.jna.Structure.() Structure.java:151
com.sun.jna.platform.win32.OleAuto$DISPPARAMS.() OleAuto.java:379
com.sun.jna.platform.win32.OleAuto$DISPPARAMS$ByReference.() OleAuto.java:359
com.sun.jna.platform.win32.COM.util.ProxyObject.oleMethod(int, Variant$VARIANT$ByReference, IDispatch, OaIdl$DISPID, Variant$VARIANT[]) ProxyObject.java:596
com.sun.jna.platform.win32.COM.util.ProxyObject.oleMethod(int, Variant$VARIANT$ByReference, IDispatch, String, Variant$VARIANT[]) ProxyObject.java:574
com.sun.jna.platform.win32.COM.util.ProxyObject.getProperty(Class, String, Object[]) ProxyObject.java:381
com.sun.jna.platform.win32.COM.util.ProxyObject.invokeSynchronised(Object, Method, Object[]) ProxyObject.java:260
com.sun.jna.platform.win32.COM.util.ProxyObject.invoke(Object, Method, Object[]) ProxyObject.java:220
[…]
Thread-2 tries to initialize Class OleAuto but this requires the libraries Lock:
com.sun.jna.Native.cacheOptions(Class, Map, Object) Native.java:1547
com.sun.jna.Native.loadLibrary(String, Class, Map) Native.java:428
com.sun.jna.platform.win32.OleAuto.() OleAuto.java:102
com.sun.jna.platform.win32.Variant$VARIANT.(String) Variant.java:198
com.sun.jna.platform.win32.COM.util.Convert.toVariant(Object) Convert.java:41
com.sun.jna.platform.win32.COM.util.ProxyObject.invokeMethod(Class, String, Object[]) ProxyObject.java:407
com.sun.jna.platform.win32.COM.util.ProxyObject.invokeSynchronised(Object, Method, Object[]) ProxyObject.java:267
com.sun.jna.platform.win32.COM.util.ProxyObject.invoke(Object, Method, Object[]) ProxyObject.java:220
I have observed a dead lock in class initialization, if two threads try to initialize a COM-Connection. My analysis is based on version 4.1.0. I have observed some bigger delay (~6s) in Thread-1 before the lock, while the Application is found in the RunningObjectTable. This is because of doors, which delays until the login is shown, but register in the ROT before.
Thread-1 is in Native.loadLibraryInstance with lock on libraries but waits for DISPPARAMS containing class OleAuto:
sun.misc.Unsafe.ensureClassInitialized(Class) Unsafe.java (native)
sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(Field, boolean) UnsafeFieldAccessorFactory.java:43
sun.reflect.ReflectionFactory.newFieldAccessor(Field, boolean) ReflectionFactory.java:140
java.lang.reflect.Field.acquireFieldAccessor(boolean) Field.java:1057
java.lang.reflect.Field.getFieldAccessor(Object) Field.java:1038
java.lang.reflect.Field.get(Object) Field.java:379
com.sun.jna.Native.loadLibraryInstance(Class) Native.java:447
com.sun.jna.Native.getLibraryOptions(Class) Native.java:508
com.sun.jna.Native.getStructureAlignment(Class) Native.java:596
com.sun.jna.Structure.setAlignType(int) Structure.java:251
com.sun.jna.Structure.(Pointer, int, TypeMapper) Structure.java:176
com.sun.jna.Structure.(Pointer, int) Structure.java:172
com.sun.jna.Structure.(int) Structure.java:159
com.sun.jna.Structure.() Structure.java:151
com.sun.jna.platform.win32.OleAuto$DISPPARAMS.() OleAuto.java:379
com.sun.jna.platform.win32.OleAuto$DISPPARAMS$ByReference.() OleAuto.java:359
com.sun.jna.platform.win32.COM.util.ProxyObject.oleMethod(int, Variant$VARIANT$ByReference, IDispatch, OaIdl$DISPID, Variant$VARIANT[]) ProxyObject.java:596
com.sun.jna.platform.win32.COM.util.ProxyObject.oleMethod(int, Variant$VARIANT$ByReference, IDispatch, String, Variant$VARIANT[]) ProxyObject.java:574
com.sun.jna.platform.win32.COM.util.ProxyObject.getProperty(Class, String, Object[]) ProxyObject.java:381
com.sun.jna.platform.win32.COM.util.ProxyObject.invokeSynchronised(Object, Method, Object[]) ProxyObject.java:260
com.sun.jna.platform.win32.COM.util.ProxyObject.invoke(Object, Method, Object[]) ProxyObject.java:220
[…]
Thread-2 tries to initialize Class OleAuto but this requires the libraries Lock:
com.sun.jna.Native.cacheOptions(Class, Map, Object) Native.java:1547
com.sun.jna.Native.loadLibrary(String, Class, Map) Native.java:428
com.sun.jna.platform.win32.OleAuto.() OleAuto.java:102
com.sun.jna.platform.win32.Variant$VARIANT.(String) Variant.java:198
com.sun.jna.platform.win32.COM.util.Convert.toVariant(Object) Convert.java:41
com.sun.jna.platform.win32.COM.util.ProxyObject.invokeMethod(Class, String, Object[]) ProxyObject.java:407
com.sun.jna.platform.win32.COM.util.ProxyObject.invokeSynchronised(Object, Method, Object[]) ProxyObject.java:267
com.sun.jna.platform.win32.COM.util.ProxyObject.invoke(Object, Method, Object[]) ProxyObject.java:220