la instalación de singleton lazy-safe para subprocesos no es fácil de entender para cada codificador, por lo que quería crear una clase en nuestro framework empresarial que hiciera el trabajo.Patrón para creación de instancias de singleton lazy thread-safe en java
¿Qué opina sobre eso? ¿Ves algo malo al respecto? ¿Hay algo similar en Apache Commons? ¿Cómo puedo hacerlo mejor?
Supplier.java
public interface Supplier<T> {
public T get();
}
LazyThreadSafeInstantiator.java
public class LazyThreadSafeInstantiator<T> implements Supplier<T> {
private final Supplier<T> instanceSupplier;
private volatile T obj;
public LazyThreadSafeInstantiator(Supplier<T> instanceSupplier) {
this.instanceSupplier = instanceSupplier;
}
@Override
// http://en.wikipedia.org/wiki/Double-checked_locking
public T get() {
T result = obj; // Wikipedia: Note the usage of the local variable result which seems unnecessary. For some versions of the Java VM, it will make the code 25% faster and for others, it won't hurt.
if (result == null) {
synchronized(this) {
result = obj;
if (result == null) {
result = instanceSupplier.get();
obj = result;
}
}
}
return result;
}
}
Ejemplo de uso:
public class Singleton1 {
private static final Supplier<Singleton1> instanceHolder =
new LazyThreadSafeInstantiator<Singleton1>(new Supplier<Singleton1>() {
@Override
public Singleton1 get() {
return new Singleton1();
}
});
public Singleton1 instance() {
return instanceHolder.get();
}
private Singleton1() {
System.out.println("Singleton1 instantiated");
}
}
Gracias
Mi mayor problema es con el patrón en sí. De Wikipedia: Algunos lo consideran un antipatrón, a juzgar por su uso excesivo, introduce limitaciones innecesarias en situaciones en las que no se requiere realmente una instancia única de una clase e introduce estado global en una aplicación. Considere el uso de inyección de dependencia en su lugar. –
Yo recomendaría evitar algo como esto. Use un marco DI en su lugar. –
posible duplicado de [patrón único en Intialización java-lazy] (http://stackoverflow.com/questions/2521895/singleton-pattern-in-java-lazy-intialization) –