Junior
Kokia yra raktažodžio lock funkcija C# kalboje?
sobes.tech AI
Atsakymas iš AI
Raktinis žodis lock naudojamas daugiagijų programose išteklių sinchronizavimui. Jis garantuoja, kad tik viena srautas gali vykdyti lock bloko kodą tam tikru momentu:
Veikimo principas:
lockpriima kaip argumentą objektą, kuris naudojamas kaip mutexas (monitorius).- Prieš vykdant
lockbloko kodą, srautas bando gauti nurodyto objekto monopolį. - Jei užraktas laisvas, srautas jį gauna ir vykdo kodą.
- Jei užraktas užimtas kitu srautu, dabartinis srautas blokuojamas (pereina į laukimo būseną), kol užraktas bus atlaisvintas.
- Išėjus iš
lockbloko (net ir išimties atveju), užraktas automatiškai atlaisvinamas.
Naudojama bendriems ištekliams apsaugoti, tokiems kaip klasių laukai, kolekcijos ar kiti objektai, į kuriuos gali kreiptis keli srautai vienu metu, siekiant išvengti lenktynių sąlygų (race conditions) ir užtikrinti duomenų vientisumą:
Pavyzdys:
public class SharedResource
{
private int _counter;
private readonly object _lockObject = new object(); // Sinchronizacijos objektas
public void Increment()
{
lock (_lockObject) // Vienu metu prieiga prie kodo bloko
{
_counter++; // Saugi bendro ištekliaus keitimas
}
}
public int GetCounter()
{
lock (_lockObject) // Taip pat vienu metu skaitant
{
return _counter;
}
}
}
Svarbūs punktai:
- Užrakinimo objektas turi būti nuorodos tipo ir dažniausiai privatūs laukai (
readonly), siekiant išvengti išorės įsikišimo. - Venkite naudoti
string,thisartypeof(TypeName)tipus, nes jie gali būti bendrinami arba prieinami išorėje, kas gali sukelti užrakinimo konfliktus (deadlocks) arba netinkamą veikimą. lockyra sintaksinis cukrusMonitorklasės metodų naudojimui.