I believe that according to section 2.17.5 of the JVMS, java class
initialization can deadlock.
Consider:
class A {
static int x = 1;
static {
B.y = 1;
}
}
class B {
static int y = 2;
static {
A.x = 2;
}
}
If two separate threads tried to initialize classes A and B and the
same time, deadlock could occur.
Here is the sequence of events:
T1 executes steps 1 and 6 of 2.17.5 on class A. Class A is now marked
as InProgress, and unlocked.
T2 executes steps 1 and 6 of 2.17.5 on class B. Class B is now marked
as InProgress, and unlocked.
T1 executes step 8 of 2.17.5 on class A. This involves an active use of B,
so T1 tries to initialize B.
T1 executes step 1 on class B. Since B is marked as InProgress, T1 then
executes step 2, by waiting on B.
T2 executes step 8 of 2.17.5 on class B. This involves an active use of A,
so T2 tries to initialize B.
T2 executes step 1 on class A. Since A is marked as InProgress, T2 then
executes step 2, by waiting on A.
Deadlock.
I've been able to get this behavior to occur very consistently by
putting a two-way barrier in the static initializers for class A and
B.
Is this something we want to fix?
Note that circular initialization does occur. From the 1.4.2 b18 build:
IC: Initialization circularity between
com.sun.jndi.ldap.LdapPoolManager and com.sun.jndi.ldap.pool.Pool
IC: Initialization circularity between
sun.awt.datatransfer.DataTransferer and
sun.awt.datatransfer.DataTransferer$CharsetComparator
IC: Initialization circularity between
sun.awt.datatransfer.DataTransferer and
sun.awt.datatransfer.DataTransferer$DataFlavorComparator
IC: Initialization circularity between
sun.awt.datatransfer.DataTransferer$CharsetComparator and
sun.awt.datatransfer.DataTransferer$DataFlavorComparator
IC: Initialization circularity between
sun.nio.cs.ThreadLocalCoders and sun.nio.cs.ThreadLocalCoders$1
IC: Initialization circularity between
sun.nio.cs.ThreadLocalCoders and sun.nio.cs.ThreadLocalCoders$2
IC: Initialization circularity between
sun.nio.cs.ThreadLocalCoders$1 and sun.nio.cs.ThreadLocalCoders$2
-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:00:42 EDT