Reports static variables that are lazily initialized in a non-thread-safe manner.

Lazy initialization of static variables should be done with an appropriate synchronization construct to prevent different threads from performing conflicting initialization.

When applicable, a quick-fix, which introduces the lazy initialization holder class idiom, is suggested. This idiom makes use of the fact that the JVM guarantees that a class will not be initialized until it is used.

Example:


  class X {
    private static List<String> list;

    public List<String> getList() {
      if (list == null) {
        list = List.of("one", "two", "tree");
      }
      return list;
    }
  }

After the quick-fix is applied:


  class X {
    private static final class ListHolder {
      static final List<String> list = List.of("one", "two", "tree");
    }

    public List<String> getList() {
      return ListHolder.list;
    }
  }