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.