...
Code Block | ||
---|---|---|
| ||
public class Lazy {
private static boolean flag = false;
static {
Thread t = new Thread(new Runnable() {
public void run() {
// Initialize, for example, a database connection
flag = true;
}
});
t.start();
try {
t.join();
} catch(InterruptedException ie) {
throw new AssertionError(ie);
}
// Other initialization
}
public static void main(String[] args) {
System.out.println(flag);
}
}
|
...
The field flag
is not required to be volatile
because the initialization is being carried out in a static initializer and is guaranteed to finish before the object becomes usable.
Similar to this noncompliant code example, threads should not be started from constructors. See CON14-J. Do not let the "this" reference escape during object construction for more information.
Compliant Solution (static
initializer, no background threads)
...