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:
- A
lockegy objektumot fogad argumentumként, amit mutexként (monitor) használnak. - A
lockblokkban 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. - Ha a zárolás szabad, a szál megkapja és végrehajtja a kódot.
- 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.
- A
lockblokk 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,thisvagytypeof(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
lockszintaktikus cukor aMonitorosztály metódusainak használatához.