Sobes.tech
Junior — Middle

Можете ли да обясните как се реализира механиката на блокиране при използване на synchronized или lock в многопоточната програмиране?

sobes.tech AI

Отговор от AI

Механизмът на блокиране при използване на synchronized (в Java) или lock (в C#) се основава на използването на примитиви за синхронизация, които осигуряват изключителен достъп до критичната секция на кода.

Когато нишка влезе в блок, защитен с lock или synchronized, тя се опитва да придобие свързания с този блок обект-заключване (mutex). Ако заключването е свободно, нишката го придобива и продължава изпълнението. Ако заключването вече е заето от друга нишка, текущата нишка се блокира (чака), докато заключването не бъде освободено.

Пример в C# с lock:

private readonly object _lockObj = new object();

void CriticalSection() {
    lock(_lockObj) {
        // код, който трябва да се изпълнява само от една нишка едновременно
    }
}

Вътре в lock, компилаторът генерира извиквания към методите Monitor.Enter и Monitor.Exit, които управляват придобиването и освобождаването на заключването.

По този начин, механиката на блокиране гарантира, че само една нишка изпълнява критичната секция едновременно, предотвратявайки състезателни условия и осигурявайки коректността на данните.