title: Are Java static initializers thread safe?
body: <p>I'm using a static code block to initialize some controllers in a registry I have. My question is therefore, can I guarantee that this static code block will only absolutely be called once when the class is first loaded? I understand I cannot guarantee when this code block will be called, I'm guessing its when the Classloader first loads it. I realize I could synchronize on the class in the static code block, but my guess is this is actually what happens anyway? </p>
  
  <p>Simple code example would be;</p>
  
  <pre><code>class FooRegistry {
  
      static {
          //this code must only ever be called once 
          addController(new FooControllerImpl());
      }
  
      private static void addController(IFooController controller) { 
          // ...
      }
  }
  </code></pre>
  
  <p>or should I do this;</p>
  
  <pre><code>class FooRegistry {
  
      static {
          synchronized(FooRegistry.class) {
              addController(new FooControllerImpl());
          }
      }
  
      private static void addController(IFooController controller) {
          // ...
      }
  }
  </code></pre>