AOWS

Just another adrian’s weblog

Singleton bajo demanda y thread-safe

leave a comment »

El Singleton es uno de los más conocidos, usados y también sencillos patrones de diseño. La forma más común de implementarlo es la siguiente:

public class SampleClass {

  private static final SampleClass INSTANCE = new SampleClass();

  private SampleClass() { ... }

  public SampleClass getInstance() {
    return INSTANCE;
  }

}

Esta implementación tiene un punto negativo: instanciamos un nuevo objeto vayamos o no a usarlo. Si esta instanciación es costosa, podría afectar al rendimiento.

Una alternativa es utilizar una inicialización lazy (vaga, o bajo demanda):

public class SampleClass {

  private static SampleClass INSTANCE = null;

  private SampleClass() { ... }

  public SampleClass getInstance() {
    if (INSTANCE==null)
      INSTANCE = new SampleClass();
    return INSTANCE;
  }

}

Pero de nuevo, esta solución tiene un problema. En este caso no es thread-safe, lo cual quiere decir que puede haber problemas si dos hilos ejecutan el código de inicialización simultáneamente (se puede instanciar el objecto dos veces). Esto se puede resolver utilizando Java 5.

Una buena implementación es la propuesta por Bill Pugh: Initialization on demand holder idiom.

public class SampleClass {

  private SampleClass() { ... }

  private static class LazyHolder {
    private static final SampleClass INSTANCE = new SampleClass();
  }

  public static Something getInstance() {
    return LazyHolder.INSTANCE; (1)
  }

}

Esta vía se aprovecha de la forma en la que inicializa los objetos la máquina virtual de Java, y es que la clase estática embebida (LazyHolder) sólo se inicializa cuando se accede a su variable (1). Quizá sea la mejor de las soluciones, aunque la primera será perfectamente válida en la mayor parte de los casos.

Tengo pendiente echarle un ojo a la nueva tendencia iniciada por Bloch en su Effective Java, la de utilizar tipos enumerados.

Written by adrian

26 julio, 2008 a 01:15

Publicado en Posts

Tagged with , , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: