Idioma de Initialize-On-Demand vs simple inicializador estático en la implementación Singleton

Es realmente necesario el lenguaje Initialize-On-Demand cuando se implementa un singleton seguro para subprocesos mediante la inicialización estática, o sería suficiente una simple declaración estática de la instancia?

Declaración simple de instancia como campo estático:

class Singleton
{
 private static Singleton instance=new Singleton();

 private Singleton () {..}
 public static Singleton getInstance()
 {
  return instance;
 }
}

vs

class Singleton {
   static class SingletonHolder {
      static final Singleton INSTANCE = new Singleton();
   }

   private Singleton () {..}

   public static Singleton getInstance() {
      return SingletonHolder.INSTANCE;
   }
}

Pregunto esto porque Brian Goetz recomienda el primer enfoque en este artículo:

http: //www.ibm.com/developerworks/java/library/j-dcl/index.htm

mientras él sugiere lo último en este artículo

http: //www.ibm.com/developerworks/library/j-jtp03304

¿Ofrece este último enfoque algún beneficio que el primero no ofrece?

Respuestas a la pregunta(3)

Su respuesta a la pregunta