lock (Instrucción, Referencia de C#)lock statement (C# Reference)

La palabra clave lock marca un bloque de instrucciones como una sección crítica. Para ello, obtiene el bloqueo de exclusión mutua para un objeto determinado, ejecuta una instrucción y, después, libera el bloqueo.The lock keyword marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object, executing a statement, and then releasing the lock. En el ejemplo siguiente se incluye una instrucción lock.The following example includes a lock statement.

class Account
{
    decimal balance;
    private Object thisLock = new Object();

    public void Withdraw(decimal amount)
    {
        lock (thisLock)
        {
            if (amount > balance)
            {
                throw new Exception("Insufficient funds");
            }
            balance -= amount;
        }
    }
}

Para obtener más información, vea Sincronización de subprocesos.For more information, see Thread Synchronization.

ComentariosRemarks

La palabra clave lock garantiza que un subproceso no entra en una sección crítica de código mientras otro subproceso se encuentra en la sección crítica.The lock keyword ensures that one thread does not enter a critical section of code while another thread is in the critical section. Si otro subproceso intenta entrar en un código bloqueado, esperará hasta que se libere el objeto.If another thread tries to enter a locked code, it will wait, block, until the object is released.

En la sección Subprocesamiento se describen los subprocesos.The section Threading discusses threading.

La palabra clave lock llama a Enter al comienzo del bloque y a Exit al final de este.The lock keyword calls Enter at the start of the block and Exit at the end of the block. Se genera ThreadInterruptedException si Interrupt interrumpe un subproceso que está esperando para especificar una instrucción lock.A ThreadInterruptedException is thrown if Interrupt interrupts a thread that is waiting to enter a lock statement.

En general, evite el bloqueo en un tipo public o en instancias que estén fuera del control de su código.In general, avoid locking on a public type, or instances beyond your code's control. Las construcciones comunes lock (this), lock (typeof (MyType)) y lock ("myLock") incumplen esta instrucción:The common constructs lock (this), lock (typeof (MyType)), and lock ("myLock") violate this guideline:

  • lock (this) es un problema si la instancia es accesible públicamente.lock (this) is a problem if the instance can be accessed publicly.

  • lock (typeof (MyType)) es un problema si MyType es accesible públicamente.lock (typeof (MyType)) is a problem if MyType is publicly accessible.

  • lock("myLock") es un problema porque cualquier otro código del proceso que use la misma cadena compartirá el bloqueo.lock("myLock") is a problem because any other code in the process using the same string, will share the same lock.

Se recomienda definir un objeto private para bloquear, o una variable de objeto private static para proteger los datos comunes a todas las instancias.Best practice is to define a private object to lock on, or a private static object variable to protect data common to all instances.

No se puede usar la palabra clave await en el cuerpo de una instrucción lock.You can't use the await keyword in the body of a lock statement.

Ejemplo: subprocesos sin bloquearExample - Threads without locking

En el ejemplo siguiente se muestra un uso simple de los subprocesos sin bloquear en C#:The following sample shows a simple use of threads without locking in C#:

Ejemplo: subprocesos con bloqueoExample - Threads using locking

En el ejemplo siguiente se usan subprocesos y lock.The following sample uses threads and lock. Siempre que la instrucción lock esté presente, el bloque de instrucciones será una sección crítica y balance nunca se convertirá en un número negativo:As long as the lock statement is present, the statement block is a critical section and balance will never become a negative number:

especificación del lenguaje C#C# language specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also