comunicado El bloqueo no "Código de bloqueo" o cualquier recurso que va en entre las llaves pre se.
Encuentro que es mejor entender el bloqueo desde la perspectiva de un hilo (después de todo, en los escenarios de subprocesamiento es cuando debe considerar el bloqueo).
Dada su código de ejemplo
10 locker = new object();
11 lock (locker)
12 {
...
15 }
Cuando hilo X alcanza la línea 10 se crea un nuevo objeto y en la línea 11 una cerradura se adquiere en el objeto. El hilo X continúa ejecutando cualquier código que esté dentro del bloque.
Ahora, mientras que el hilo X está en el medio de nuestro bloque, el hilo Y llega a la línea 10. Y he aquí que se crea un objeto nuevo y, como está creado por el hilo Y, no se adquiere ningún bloqueo en este objeto. Por lo tanto, cuando la rosca Y llegue a 11, conseguirá con éxito un bloqueo en el objeto y continuará ejecutando el bloque al mismo tiempo que la rosca X.
Esta es la situación que se suponía que el bloqueo debía evitar. ¿Entonces lo que hay que hacer? Haga que el casillero sea un objeto compartido .
01 static object locker = new object();
...
11 lock (locker)
12 {
...
15 }
Ahora, cuando el hilo X llega a la línea 11, adquirirá el bloqueo y comenzará la ejecución del bloque. Cuando el hilo Y alcanza la línea 11 intentará adquirir un bloqueo en el mismo objeto que el hilo X. Como este objeto ya está bloqueado, el hilo Y esperará hasta que se libere el bloqueo. De este modo, se evita la ejecución concurrente del bloque de código, protegiendo así los recursos utilizados por ese código para que se acceda simultáneamente.
Nota: si otras partes de su sistema se deben serializar con los mismos recursos, todas deben intentar bloquear el mismo objeto de bloque compartido.
Una explicación aún mejor para un principiante. Muchas gracias oh muchísimo –
Eres totalmente bienvenido :) –