Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 20027|Respuesta: 0

[Fuente] La palabra clave C# lock marca un bloque de sentencias como área crítica al obtener un mutex para un objeto dado, ejecutando la sentencia, pero...

[Copiar enlace]
Publicado en 31/12/2015 17:51:01 | | |
La palabra clave lock marca un bloque de sentencias como zona crítica tomando un mutex para un objeto dado, ejecutando la sentencia y luego liberando el bloqueo.

La instrucción lock básicamente usa Monitor.Enter y Monitor.Exit, es decir, Monitor.Enter(this) se ejecuta cuando se ejecuta lock(this), y Monitor.Exit(this) se ejecuta al final del braquete. ¿Cuál es su significado? Para cualquier objeto, la primera parte de la memoria es la dirección de todos los métodos, y la segunda parte es un índice. Señala un SyncBlock en el área de caché SyncBlock del CLR. ¿Qué significa eso? Es decir, cuando ejecutas Monitor.Enter(Object), si el valor del índice del objeto es negativo, selecciona un SyncBlock de la caché de SyncBlock y coloca su dirección en el índice del objeto. Esto completa el bloqueo marcado por objeto, y los otros hilos quieren realizar de nuevo la operación Monitor.Enter(objeto), que obtendrá un índice con un objeto positivo, y luego esperar. Hasta que el índice se vuelve negativo, es decir, el hilo utiliza Monitor.Exit(objeto) para convertir el índice en negativo.

A lo que debes prestar atención al usar la cerradura:
1.lock no puede bloquear el valor nulo Un objeto puede apuntar a nulo, pero no es necesario liberar nulo. (Véase también: Entendiendo el Nulo Completo)
2.lock no puede bloquear el tipo de cadena, aunque también es un tipo de referencia. Porque el tipo de cadena está "flotado" por el CLR
Esto significa que solo hay una instancia de una cadena dada en todo el programa, y ese mismo objeto representa ese texto en todos los hilos de todos los dominios de aplicación en ejecución. Por lo tanto, mientras se coloque un bloqueo en una cadena con el mismo contenido en cualquier parte del proceso de aplicación, todas las instancias de esa cadena en la aplicación estarán bloqueadas. Por lo tanto, es mejor bloquear a miembros privados o protegidos que no se permitan persistir.
3. bloqueo El objeto es el límite de memoria de un bloque de programa
4. El tipo de valor no puede bloquearse, porque el "objeto se libera" en rojo en el texto anterior, y el tipo de valor no es un tipo de referencia
5.bloqueo evita bloquear tipos públicos u objetos que no están controlados por el programa.
Por ejemplo, si la instancia es accesible públicamente, el bloqueo puede ser problemático porque el código no controlado también puede bloquear el objeto. Esto puede provocar bloqueos, donde dos o más hilos esperan para liberar el mismo objeto. Bloquear los tipos de datos públicos (en lugar de objetos) también puede causar problemas por la misma razón.
Al usar lock(this), el valor de la variable miembro de clase puede cambiarse mediante el método que no está en la zona crítica

Escenario de aplicación: A menudo se utiliza para evitar excepciones inciertas en el valor de variables públicas causadas por operaciones multihilo para garantizar la seguridad de las operaciones









Anterior:Win8 inicia el servicio SQL Server 2012
Próximo:[Velocidad] ¡Escáner de puerto abierto de segmento IP para velocidad de escaneo rápida!
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com