Это проще, чем вы думаете.
Согласно Microsoft :
Ключевое слово lock
гарантирует, что один поток не войдет в критический раздел кода, в то время как другой поток находится в критическом разделе. Если другой поток попытается ввести заблокированный код, он будет ждать блокировки до тех пор, пока объект не будет освобожден.
Ключевое слово lock
вызывает Enter
в начале блока и Exit
в конце блока. Ключевое слово lock
фактически обрабатывает Monitor
класс на заднем конце.
Например:
private static readonly Object obj = new Object();
lock (obj)
{
// critical section
}
В приведенном выше коде сначала поток входит в критическую секцию, а затем блокирует obj
. Когда другой поток пытается войти, он также пытается заблокировать obj
, который уже заблокирован первым потоком. Мне придется подождать, пока первый поток выпустит obj
. Когда первый поток уходит, другой поток заблокирует obj
и войдет в критическую секцию.