In a multi-threaded situation, un-synchronized
lazy initialization of static fields could mean that a second thread has access to a
half-initialized object while the first thread is still creating it. Allowing such access could cause serious bugs. Instead. the initialization block
should be synchronized
.
Similarly, updates of such fields should also be synchronized
.
This rule raises an issue whenever a lazy static initialization is done on a class with at least one synchronized
method, indicating
intended usage in multi-threaded applications.
private static Properties fPreferences = null; private static Properties getPreferences() { if (fPreferences == null) { fPreferences = new Properties(); // Noncompliant fPreferences.put("loading", "true"); fPreferences.put("filterstack", "true"); readPreferences(); } return fPreferences; } }
private static Properties fPreferences = null; private static synchronized Properties getPreferences() { if (fPreferences == null) { fPreferences = new Properties(); fPreferences.put("loading", "true"); fPreferences.put("filterstack", "true"); readPreferences(); } return fPreferences; } }