Sobes.tech
Junior — Middle

Môžete vysvetliť, ako je implementovaná mechanika blokovania pri použití synchronized alebo lock v viacvláknovom programovaní?

sobes.tech AI

Odpoveď od AI

Mechanizmus blokovania pri použití synchronized (v Jave) alebo lock (v C#) je založený na použití primitives synchronizácie, ktoré zabezpečujú exkluzívny prístup ku kritickej sekcii kódu.

Keď vlákno vstúpi do bloku chráneného lock alebo synchronized, pokúsi sa získať priradený objektový zámok (mutex). Ak je zámok voľný, vlákno ho získa a pokračuje v vykonávaní. Ak je zámok už obsadený iným vláknom, aktuálne vlákno sa zablokuje (čaká), kým sa zámok neuvoľní.

Príklad v C# s lock:

private readonly object _lockObj = new object();

void CriticalSection() {
    lock(_lockObj) {
        // kód, ktorý má byť vykonávaný iba jedným vláknom naraz
    }
}

Vnútri lock generuje prekladač volania na metódy Monitor.Enter a Monitor.Exit, ktoré spravujú získanie a uvoľnenie zámku.

Týmto spôsobom mechanizmus blokovania garantuje, že iba jedno vlákno vykonáva kritickú sekciu naraz, čím sa predchádza podmienkam súťažnosti a zabezpečuje integritu dát.