Sobes.tech
Junior

C# тилиндеги lock ачкыч сөзүнүн функциясы эмне?

sobes.tech AI

AIден жооп

Ключевое слово lock көптөгөн агымдуу колдонмолордо ресурстарга кирүүнү синхрондоштуруу үчүн колдонулат. Ал бир агым гана lock блоктун ичинде кодду аткара алат деген кепилдик берет:

Ишке ашыруу принциби:

  1. lock аргумент катары объектти кабыл алат, ал мьютекс (монитор) катары колдонулат.
  2. lock блокунун ичинде кодду аткаруудан мурун, агым белгилүү объектке монополиялык бөгөт коюуну алууга аракет кылат.
  3. Эгер бөгөт бош болсо, агым аны алат жана кодду аткарат.
  4. Эгер бөгөт башка агым тарабынан алынган болсо, учурдагы агым күтүүгө өтөт (күтүү абалына өтөт), бөгөт бошотулгуча.
  5. 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 классынын методдорун колдонуу үчүн.