Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
framework-6.0.1
-
None
Description
Hello.
When resolving a class in parallel in Java 10, you end up with a freeze.
You end up with threads beeing blocked
"Thread-99" #121 prio=5 os_prio=0 tid=0x000001bdaf679000 nid=0x69d4 in Object.wait() [0x000000296d0fe000] java.lang.Thread.State: BLOCKED (on object monitor) at java.lang.Object.wait(java.base@10.0.2/Native Method) - waiting on <0x00000006c931dd20> (a [Ljava.lang.Object;) at java.lang.Object.wait(java.base@10.0.2/Object.java:328) at org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:4301) - waiting to re-lock in wait() <0x00000006c931dd20> (a [Ljava.lang.Object;) at org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:413) at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3318) at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1618) at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:978) at org.apache.felix.framework.ConcurrentClassLoaderTest$1.run(ConcurrentClassLoaderTest.java:69)
You'll find attached a test reproducing the issue : ConcurrentClassLoaderTest.java
Here's what you need to freeze felix :
- Lots of threads trying to acquire the global lock
- here we're resolving a class from a bundle with dynamic import packages
- An Oracle JDK 10 or OpenJDK 11
- it's working fine with Oracle JDK 8
Replacing the m_bundleLock by a fair ReentrantLock with a Condition makes it work with 10 parallel threads but still fails with 100 threads.
Attachments
Attachments
Issue Links
- links to