Sobes.tech
Junior

Ի՞նչ է lock բառի գործառույթը C# լեզվում։

sobes.tech AI

Պատասխան AI-ից

Բանալի բառը lock օգտագործվում է բազմատողային ծրագրերում ռեսուրսների մուտքի սինխրոնիզացման համար: Այն երաշխավորում է, որ միայն մեկ թև կարող է կատարել lock բլոկի կոդը տվյալ պահին:

Աշխատանքի սկզբունքը:

  1. lock ընդունում է որպես արգումենտ օբյեկտ, որը օգտագործվում է մյուտեքս (մոնիտոր) ի համար:
  2. Նախքան lock բլոկի կոդը գործարկել, թևը փորձում է ստանալ նշված օբյեկտի մոնոպոլային արգելափակումը:
  3. Եթե արգելափակումը ազատ է, թևը ստանում է այն և executes կոդը:
  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) տիպերի օգտագործումից, քանի որ դրանք կարող են համատեղ օգտագործվել կամ հասանելի լինել արտաքինից, ինչը կարող է հանգեցնել միմյանց բլոկավորումների կամ սխալ աշխատանքի:
  • lock-ը սինտաքսիկ շաքար է Monitor դասի մեթոդների օգտագործման համար։