Sobes.tech
Junior

Qual é a função da palavra-chave lock na linguagem C#?

sobes.tech IA

Resposta da IA

A palavra-chave lock é usada para sincronizar o acesso a recursos em aplicações multithread. Garante que apenas um thread pode executar o código dentro do bloco lock num dado momento.

Princípio de funcionamento:

  1. lock aceita como argumento um objeto que é usado como mutex (monitor).
  2. Antes de executar o código dentro do bloco lock, o thread tenta obter um bloqueio exclusivo no objeto especificado.
  3. Se o bloqueio estiver livre, o thread obtém-no e executa o código.
  4. Se o bloqueio estiver ocupado por outro thread, o thread atual fica bloqueado (passa para estado de espera) até que o bloqueio seja liberado.
  5. Ao sair do bloco lock (mesmo em caso de exceção), o bloqueio é liberado automaticamente.

É usado para proteger recursos compartilhados, como campos de classes, coleções ou outros objetos aos quais vários threads podem aceder simultaneamente, para evitar condições de corrida e garantir a integridade dos dados.

Exemplo de uso:

public class SharedResource
{
    private int _counter;
    private readonly object _lockObject = new object(); // Objeto para sincronização

    public void Increment()
    {
        lock (_lockObject) // Acesso exclusivo ao bloco de código
        {
            _counter++; // Alteração segura do recurso comum
        }
    }

    public int GetCounter()
    {
        lock (_lockObject) // Acesso exclusivo também na leitura
        {
            return _counter;
        }
    }
}

Pontos importantes:

  • O objeto para bloqueio deve ser de tipo referência e, geralmente, um campo privado (readonly) para evitar interferência externa.
  • Evite bloquear tipos como string, this ou typeof(TypeName), pois podem ser usados em conjunto ou acessíveis de fora, o que pode levar a deadlocks ou funcionamento incorreto.
  • lock é açúcar sintático para usar os métodos da classe Monitor.