Estoy implementando una clase singleton en Java para asegurarme de que no se cree más de una instancia de la clase.¿Cómo hacer que una clase singleton sea segura para los hilos?
Respuesta
Quizás la mejor manera es usar una enumeración con una sola instancia. Esto tiene el beneficio adicional de ser serializable y garantizar el singleton-ness contra la serialización y la reflexión, lo que ninguna implementación de Singleton "directa" hace (¿privado? ¡Tengo reflexión, me burlo burlonamente de tus modificadores de acceso!). También es muy simple de implementar:
public enum Singleton {
INSTANCE;
// fields and methods go here
}
Los Singletons no son seguros para roscar por defecto. La forma común de crear un singleton es tener un método de fábrica que maneje la creación de la instancia única. De esa forma puedes controlar la creación de instancias.
public class Singleton {
public static final Singleton INSTANCE = new Singleton();
private Singleton() { ... }
}
El uso de una variable de instancia estática es preferible a la clase interna "Titular". Si lo desea, también puede hacer que el miembro estático sea privado y proporcionar un método para acceder a él, pero todo lo que hace es agregar otra llamada a método a la pila.
Más bien depende de lo que intenta lograr en cuanto a lo que se prefiere - el titular le da un singleton perezosa, la versión más simple no le da carga lenta. –
Sí, lo hace. Java no carga clases hasta que se usan por primera vez. –
No del todo cierto. Los carga cuando se mencionan por primera vez, p. en el método firma de otra clase. – skaffman
What about lazy instanciation: getInstance() devuelve el singleton o lo crea si es la primera llamada.
public class MySingleton
{
private static MySingleton instance;
private MySingleton()
{
// construct object . . .
}
// For lazy initialization
public static synchronized MySingleton getInstance()
{
if (instance==null)
{
instance = new MySingleton();
}
return instance;
}
// Remainder of class definition . . .
}
La instanciación lenta casi nunca es necesaria, y si lo es, Java carga las clases perezosamente, por lo que crear la instancia en la declaración * es * instanciación lenta - sin sobrecarga de sincronización (en casos muy raros no es lo suficientemente floja y la respuesta de skaffman es mejor) . –
También tenga en cuenta que esta implementación sincroniza todos los intentos para obtener una referencia a la instancia. Como la mayoría de los códigos harán algo como: Singleton.getInstance.doSomething(); Singleton.getInstance.doSomethingElse(); El efecto general sería una sincronización adicional que limitaría severamente la concurrencia sin garantías de seguridad de subprocesos en términos de acceso/mutación de miembro. –
El bloqueo con doble comprobación en java está roto http://www.javaworld.com/jw-02-2001/jw-0209-double.html En resumen, esta forma de garantizar que esta clase se instancia solo una vez puede dar como resultado problemas de concurrencia difíciles de encontrar. Nunca use esto – Buhb
¿La mejor manera de hacer un singleton? Usa una enumeración
public enum Singleton {
INSTANCE;
public void foo(){ ... }
}
// Usage:
Singleton.INSTANCE.foo();
Tienes un montón de ayuda de la máquina virtual no sólo para evitar la doble ejemplificación, sino que también ayuda a evitar la corrupción deserialización.
Si le importa la simultaneidad, no utilizará el estado global compartido.
Si el singleton contiene la acumulación de resultados de un singular problema paralelizado, ¿por qué no? Un singleton personifica el estado global y, como tal, sería un escenario de uso justo. –
Existen varios casos de uso para clases representadas con solo una instancia compartida entre procesos.Una aplicación web típica y bien diseñada que utilice un resorte probablemente tendrá un grupo de clases instanciadas en un alcance único, compartido entre los hilos del trabajador. – Buhb
- 1. Hacer que una lista enlazada sea segura
- 2. ¿Cómo hacer que mi WPF MainWindow sea singleton?
- 3. Haciendo que una biblioteca C sea segura
- 4. Clase base abstracta para forzar que cada clase derivada sea Singleton
- 5. ¿Cómo hacer que una cadena de Ruby sea segura para un sistema de archivos?
- 6. ¿Cómo implementar una aplicación Rails asíncrona segura para hilos?
- 7. ¿Cómo hacer que la traducción de los rieles 3 I18n sea automáticamente segura?
- 8. ¿Cómo puedo hacer que esta clase sea IEnumerable?
- 9. ¿Cómo hacer que una clase externa sea heredada de una clase interna?
- 10. ¿Puedo hacer que un elemento sea invisible para los ahorcables?
- 11. ¿Puedo usar boost :: threadpool como una 'cola segura para hilos'?
- 12. En PHP, ¿qué significa que una función sea binaria segura?
- 13. ¿Cómo escribir una clase segura con contraseña?
- 14. ¿Cómo puedo hacer que una ventana sea invisible para los eventos del mouse en WPF?
- 15. Hacer una clase singleton sin usar el método estático
- 16. Creando una clase singleton con dispatch_once para clase hiearchy
- 17. Force Singleton Pattern en una clase que implementa una interfaz
- 18. ¿Cómo hacer que una clave compuesta sea única?
- 19. Haga que la entrada del usuario sea segura para XML
- 20. ¿Es java.lang.Thread una clase segura para subprocesos?
- 21. La forma más eficiente de hacer que una estructura de datos sea segura (Java)
- 22. ¿Cómo hacer que NSTableView sea transparente?
- 23. clase estática vs clase singleton
- 24. ¿Cómo hacer que powershell sea menos detallado en los errores?
- 25. En Java, ¿cómo me aseguro de que mi aplicación web sea segura para subprocesos?
- 26. Establecer @property de una clase Singleton
- 27. Cómo crear una clase que sea abstracta, pero no internamente
- 28. destructor privado para clase singleton
- 29. punteros que regresan de una manera segura para los subprocesos
- 30. Cómo hacer que strpos sea insensible
+1 por burlarse de los modificadores de acceso. Yo lol'd. :) – corsiKa