Sobes.tech
Junior

რა ფუნქცია აქვს lock საკვანძო სიტყვას C# ენაში?

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 კლასის მეთოდების გამოყენებისთვის.