Re: trigger static init
On 4/11/2012 7:52 AM, Andreas Leitgeb wrote:
Lew<lewbloch@gmail.com> wrote:
Referencing the 'class' literal does not incur class initialization.
from JLS 12.4.1:
A class [...] T is initialized immediately before first [...]
T is a class and an instance of T is created.
T is a class and a static method declared by T is invoked.
A static field declared by T is assigned.
A static field declared by T is used [ ... and not constant ... ]
T is a top-level class, and an assert statement (??14.10) lexically
nested within T is executed.
Does using a class-literal<T.class> in "synchronized(T.class) {...}" count
in for implicitly using the monitor-field of the Class<T>-instance, or is
it strictly undefined (or defined somewhere else)?
So, the use of "T.class" creates an object of Class<T>, which is not
sufficient to cause T to be initialized. Some more inspection of the JLS
(and some experiments) leads me to the conclusion that a
synchronized(T.class) block can race with the initialization of T.
Experiments confirm that synchronized(T.class) does not cause
initialization of T.
--
Beware of bugs in the above code; I have only proved it correct, not
tried it. -- Donald E. Knuth