Saltar al contenido

Uso de la declaración de bloqueo para sincronizar el acceso a los datos

Es importante entender lo que pasa cuando tienes una declaración de bloqueo en tu código. Como habrás intuido, la declaración de bloqueo adquiere un bloqueo en nombre de un hilo (dándole a ese hilo ciertos derechos) y luego libera el bloqueo (renunciando a dichos derechos) al salir el hilo del bloqueo. Un hilo que logra entrar en el bloqueo de una declaración de bloqueo tiene acceso exclusivo a todo el código del bloqueo. Esto significa que cualquier otro hilo que se encuentre con la declaración de bloqueo, mientras que su bloqueo está siendo accedido por otro hilo, tiene que esperar hasta que el otro hilo haya terminado antes de poder proceder.

¿Qué hay de la variable, como el linkLock, en nuestro ejemplo de rastreo web? La declaración de bloqueo requiere una variable entre paréntesis porque necesita adquirir lo que se llama un bloqueo de exclusión mutua (es decir, mutex) en un objeto para funcionar. Especificar un objeto también tiene la ventaja de poder usar el mismo bloqueo para múltiples bloqueos. Por ejemplo, imagínese que en su aplicación de rastreo web tiene dos métodos que modifican el archivo links.txt: un método que añade una línea de texto y otro que elimina una línea de texto. Ambos métodos no sólo necesitarían un acceso exclusivo a los datos, sino también los mismos datos . Por lo tanto, no se podría permitir que AddLine y RemoveLine se ejecutaran simultáneamente. Para esos casos, bloquear la misma variable, como se indica a continuación, no sólo es aceptable sino necesario.

Uso de la declaración de bloqueo para sincronizar el acceso a los datos
Uso de la declaración de bloqueo para sincronizar el acceso a los datos
1234567891011121314151617181920212223estaticobject linksLock =newobject();staticvoidAddLine(){lock(linksLock){using(var fileStream =newFileStream("links. txt"...)){// añadir una línea}}evitar estáticamenteQuitarLínea(){lock(linksLock){using(var fileStream =newFileStream("links.txt"...)){// eliminar una línea}}}

csharp

A la inversa, puede que tenga datos no relacionados a los que cada uno necesita acceder de forma sincronizada, pero no entre sí. En ese caso, usted querrá usar objetos separados, para evitar el bloqueo innecesario. Por ejemplo, imagínese que quisiera mantener dos archivos en la aplicación de rastreo web, uno para

12345678910111213141516171819202122232425estaticobject linksLock =newobject();staticvoidWriteToLinksFile(){lock(linksLock){using(var fileStream =newFileStream("links. txt"...)){...}}}imágenes del objeto estáticoBloquear = nuevo objeto();estáticoevitarEscribirEnLacesArchivo(){bloquear(imágenesBloquear){utilizando(var fileStream =nuevoArchivoStream("imágenes.txt"...)){...}}

csharp