En C#, el siguiente código (de this página) se puede utilizar para crear instancias de una clase Singleton perezosamente de una manera segura hilo:¿Cómo se debe implementar el "bloqueo con doble control" en Delphi?
class Foo {
private volatile Helper helper = null;
public Helper getHelper() {
if (helper == null) {
lock(this) {
if (helper == null)
helper = new Helper();
}
}
return helper;
}
}
¿Cuál sería el código de Delphi hilo de seguridad equivalente?
El artículo también menciona dos problemas con una doble comprobación de bloqueo en Java:
- es posible que el nuevo objeto se construye antes de que se hizo la referencia de ayuda para apuntar al objeto recién creado lo que significa que se crean dos objetos
- es posible que la referencia auxiliar esté hecha para apuntar a un bloque de memoria mientras el objeto todavía se está creando, lo que significa que se devolverá una referencia a un objeto incompleto
Por lo tanto, aunque el código de C# y la versión de Java en el artículo mencionado son casi idénticos, solo la versión de C# funciona como se esperaba. ¿Qué lleva a la pregunta adicional si estos dos problemas también existen en una versión Delphi de bloqueo con doble control?
No podría haberlo dicho mejor ;-) –
Tengo la sensación de que falta algo esencial en este código: la implementación de C# usa la palabra clave 'volátil' para la variable auxiliar privada. Supongo que FHelper ** debe ** declararse como 'threadvar' – mjn
threadvar daría como resultado uno por hilo en lugar de un singleton compartido por todos los hilos. El volátil puede deberse al modelo de memoria .net. Pero el código anterior es correcto en x86. –