Sobes.tech
Junior

¿Cuál es la función de la palabra clave lock en el lenguaje C#?

sobes.tech AI

Respuesta de la IA

La palabra clave lock se utiliza para sincronizar el acceso a recursos en aplicaciones multihilo. Garantiza que solo un hilo pueda ejecutar el código dentro del bloque lock en un momento dado.

Principio de funcionamiento:

  1. lock acepta como argumento un objeto que se usa como mutex (monitor).
  2. Antes de ejecutar el código dentro del bloque lock, el hilo intenta obtener un bloqueo exclusivo en el objeto especificado.
  3. Si el bloqueo está libre, el hilo lo obtiene y ejecuta el código.
  4. Si el bloqueo está ocupado por otro hilo, el hilo actual se bloquea (pasa a estado de espera) hasta que el bloqueo sea liberado.
  5. Al salir del bloque lock (incluso en caso de excepción), el bloqueo se libera automáticamente.

Se usa para proteger recursos compartidos, como campos de clases, colecciones u otros objetos a los que pueden acceder varios hilos simultáneamente, para evitar condiciones de carrera y garantizar la integridad de los datos.

Ejemplo de uso:

public class SharedResource
{
    private int _counter;
    private readonly object _lockObject = new object(); // Objeto para sincronización

    public void Increment()
    {
        lock (_lockObject) // Acceso exclusivo al bloque de código
        {
            _counter++; // Modificación segura del recurso compartido
        }
    }

    public int GetCounter()
    {
        lock (_lockObject) // Acceso exclusivo también al leer
        {
            return _counter;
        }
    }
}

Puntos importantes:

  • El objeto para bloquear debe ser de tipo referencia y, por lo general, un campo privado (readonly) para evitar interferencias externas.
  • Evite bloquear tipos como string, this o typeof(TypeName), ya que pueden ser compartidos o accesibles desde fuera, lo que puede llevar a bloqueos mutuos (deadlocks) o funcionamiento incorrecto.
  • lock es azúcar sintáctico para usar los métodos de la clase Monitor.