Junior
C# тилиндеги lock ачкыч сөзүнүн функциясы эмне?
sobes.tech AI
AIден жооп
Ключевое слово lock көптөгөн агымдуу колдонмолордо ресурстарга кирүүнү синхрондоштуруу үчүн колдонулат. Ал бир агым гана lock блоктун ичинде кодду аткара алат деген кепилдик берет:
Ишке ашыруу принциби:
lockаргумент катары объектти кабыл алат, ал мьютекс (монитор) катары колдонулат.lockблокунун ичинде кодду аткаруудан мурун, агым белгилүү объектке монополиялык бөгөт коюуну алууга аракет кылат.- Эгер бөгөт бош болсо, агым аны алат жана кодду аткарат.
- Эгер бөгөт башка агым тарабынан алынган болсо, учурдагы агым күтүүгө өтөт (күтүү абалына өтөт), бөгөт бошотулгуча.
lockблокунан чыкканда (даже исключение болсо да), бөгөт автоматтык түрдө бошотулат.
Бул жалпы ресурстарды коргоо үчүн колдонулат, мисалы, класстын талаалары, коллекциялар же башка объекттер, аларга бир мезгилде бир нече агымдар кайрылышы мүмкүн, жана бул таймашуу шарттарын (race conditions) алдын алуу жана маалыматтын бүтүндүгүн камсыз кылуу үчүн:
Колдонуу мисалы:
public class SharedResource
{
private int _counter;
private readonly object _lockObject = new object(); // синхрондоштуруу объекти
public void Increment()
{
lock (_lockObject) // код блогуна бир мезгилде кирүү
{
_counter++; // жалпы ресурсты коргоо үчүн коопсуз өзгөртүү
}
}
public int GetCounter()
{
lock (_lockObject) // окуу учурунда да бир мезгилде кирүү
{
return _counter;
}
}
}
Маанилүү учурлар:
- Блоктоо үчүн объект шилтемелүү түрдө болушу керек жана адатта, жеке талаа (
readonly) болушу керек, сырттан кийлигишүүнү алдын алуу үчүн. string,this, жеtypeof(TypeName)түрлөрүн блоктоодо колдонбоңуз, анткени алар бирге колдонулушу мүмкүн же сырттан жеткиликтүү болушу мүмкүн, бул өз ара блоктоолорго (deadlocks) жана туура эмес иштөөгө алып келиши мүмкүн.lockсинтаксистик шекер болуп саналатMonitorклассынын методдорун колдонуу үчүн.