Tras .NET 4.0, se proporcionó un tipo seguro de carga perezosa en el .NET FrameworkPerezoso Lazy puede operar en un entorno multihilo, garantizadoGetValueLa función se ejecuta solo una vez, por lo que se implementaModo singleton
En el pasado, utilizábamos bloqueos de juicio cuadrático para implementar patrones singleton, o para utilizar funciones de inicialización estáticas de clases Con el tipo Lazy este proceso se simplifica y el rendimiento mejora
Cuando se crea Lazy, puedes especificar el modo de instalación del hilo, actualmente hay dos modos,Solo publicación,Explicacióny publicación
Modo PublicationOnly
1. Ejecuta la función de inicialización y encaja en un sistema internoCajatipo, resuelve el problema del juicio de valor nulo, si el caso ha sido creado, devolverá el juicio nulo,El proceso es inseguro respecto a los hilos
2. Determinar si el m_boxed está vacío, m_boxed es el campo guardado por valor; si es igual a vacío, se pone en cuadrado; este método puede asegurar atomicidad,El proceso es seguro para hilos
3. Si CreateValue devuelve vacío, significa que otros hilos ya han creado instancias, y luego se establecen en instancias ya creadas
4. Marcar el método de inicialización como inicializado, lo que suele ocurrir en el caso de ejecuciones concurrentes, y ejecutar CreateValue varias veces
Solo publicaciónse utiliza en función deInterbloqueado.CompareExchange, esta clase contiene métodos de atomicidadCAS (Comparar e intercambiar)
CAS se implementa usando instrucciones atómicas proporcionadas por la CPU, y diferentes versiones de ejecución pueden tener diferentes implementaciones Implementación específica interconectada En el método nativo, los amigos interesados pueden comprobar la implementación específica mediante código coreclr/jvm
En este modo,Una función singleton puede ejecutarse varias veces, pero al final se garantiza que solo se obtendrá una instancia
Modo de excución y publicación
Explicacióny publicaciónModo utilizado en el modoVolatile+Monitor,MonitorLo escerraduraLa implementación de la sentencia, la implementación Monitor en el código nativo, es un bloqueo de gran peso
MonitorSe soporta la suspensión de cola y de hilos, lo que puede garantizar que todo el bloque de método se ejecute en un estado de hilo único
Enlace original:El inicio de sesión del hipervínculo es visible. |