заявления замка не «кода блокировки» или любой ресурс, который идет между фигурными скобками заранее себе.
Мне кажется, что лучше понять блокировку с точки зрения перспективы (в конце концов, сценарии потоковой передачи - это когда вам нужно рассмотреть возможность блокировки).
Учитывая Ваш пример кода
10 locker = new object();
11 lock (locker)
12 {
...
15 }
Когда нить X достигает 10-й строки создается новый объект и в строке 11 замок приобретается на объекте. Thread X продолжает выполнять любой код внутри блока.
Теперь, когда поток X находится посередине нашего блока, нить Y достигает линии 10. Lo и вот, создается новый объект, и поскольку он создан нитью Y, на данный объект не происходит блокировки. Поэтому, когда поток Y достигает 11, он успешно получит блокировку объекта и продолжит выполнение блока одновременно с нитью X.
В этом случае блокировка должна была предотвращать. Так что делать? Сделать шкафчик a общий объект.
01 static object locker = new object();
...
11 lock (locker)
12 {
...
15 }
Теперь, когда поток X достигает линии 11, он получит блокировку и начнет выполнение блока. Когда поток Y достигает строки 11, он попытается получить блокировку на том же объекте, что и поток X. Поскольку этот объект уже заблокирован, поток Y будет ждать, пока блокировка не будет отпущена. Таким образом предотвращается одновременное выполнение блока кода, таким образом защищая любые ресурсы, используемые этим кодом для доступа одновременно.
Примечание: если другие части вашей системы должны быть сериализованы вокруг одних и тех же ресурсов, все они должны попытаться заблокировать один и тот же общий объект-шкафчик.
Еще лучшее объяснение для новичка. Спасибо тебе большое –
Ты так полностью приветствуешь :) –