Sobes.tech
Junior

Mi a lock kulcsszó funkciója a C# nyelvben?

sobes.tech MI

Válasz az MI-től

A lock kulcsszó multithreades alkalmazásokban az erőforrásokhoz való hozzáférés szinkronizálására szolgál. Biztosítja, hogy csak egy szál hajthassa végre a lock blokkban lévő kódot egy adott pillanatban.

Működési elv:

  1. A lock egy objektumot fogad argumentumként, amit mutexként (monitor) használnak.
  2. A lock blokkban lévő kód végrehajtása előtt a szál megpróbál kizárólagos zárolást szerezni a megadott objektumon.
  3. Ha a zárolás szabad, a szál megkapja és végrehajtja a kódot.
  4. Ha a zárolás más szál által foglalt, a jelenlegi szál blokkolódik (várakozási állapotba kerül) amíg a zárolás fel nem szabadul.
  5. A lock blokk elhagyásakor (még kivétel esetén is) a zárolás automatikusan felszabadul.

Ezt a megosztott erőforrások, például osztálymezők, kollekciók vagy más objektumok védelmére használják, amelyekhez több szál egyidejűleg hozzáférhet, hogy elkerüljék a versenyhelyzeteket (race conditions) és biztosítsák az adatok integritását.

Használati példa:

public class SharedResource
{
    private int _counter;
    private readonly object _lockObject = new object(); // Szinkronizációs objektum

    public void Increment()
    {
        lock (_lockObject) // Kódblokk kizárólagos hozzáférése
        {
            _counter++; // Biztonságos módosítás a közös erőforráson
        }
    }

    public int GetCounter()
    {
        lock (_lockObject) // Olvasáskor is kizárólagos hozzáférés
        {
            return _counter;
        }
    }
}

Fontos pontok:

  • A zároláshoz használt objektumnak referencia típusúnak kell lennie, és általában privát mező (readonly), hogy megakadályozza a külső beavatkozást.
  • Kerülje el a string, this vagy typeof(TypeName) típusok zárolását, mivel ezek megoszthatók vagy külsőleg elérhetők lehetnek, ami deadlock-okat vagy helytelen működést eredményezhet.
  • A lock szintaktikus cukor a Monitor osztály metódusainak használatához.