## Why is this an issue?

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.

### Noncompliant code example

    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;
        }
    }

### Compliant solution

    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;
        }
    }