Sobes.tech
Junior — Middle

Pode explicar como é que a mecânica de bloqueio é implementada ao usar synchronized ou lock na programação multithread?

sobes.tech IA

Resposta da IA

A mecânica de bloqueio ao usar synchronized (em Java) ou lock (em C#) baseia-se na utilização de primitivas de sincronização que garantem acesso exclusivo à secção crítica do código.

Quando uma thread entra num bloco protegido por lock ou synchronized, ela tenta adquirir o bloqueio do objeto associado a esse bloco (mutex). Se o bloqueio estiver livre, a thread o adquire e continua a execução. Se o bloqueio já estiver ocupado por outra thread, a thread atual fica bloqueada (aguarda) até que o bloqueio seja libertado.

Exemplo em C# com lock:

private readonly object _lockObj = new object();

void CriticalSection() {
    lock(_lockObj) {
        // código que deve ser executado por apenas uma thread de cada vez
    }
}

Dentro de lock, o compilador gera chamadas aos métodos Monitor.Enter e Monitor.Exit, que gerenciam a aquisição e libertação do bloqueio.

Assim, a mecânica de bloqueio garante que apenas uma thread execute a secção crítica de cada vez, prevenindo condições de corrida e garantindo a integridade dos dados.