Re: trigger static init
On 04/11/2012 07:39 AM, Joshua Cranmer wrote:
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.
It used to, in contravention of the JLS.
"A class or interface will not be initialized under any other circumstance."
<http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4.1>
It's important to note that the Java Language Specification explicitly forbids
class initialization from use of the 'class' literal. Prior to Java 5 there
was a bug that it did, which Sun fixed with version 5. This caused certain
libraries (notably Apache Commons) to break where they relied on the buggy
behavior, when run under Java 5+ under certain corner scenarios.
--
Lew
Honi soit qui mal y pense.
http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg