Я предполагаю, что он сохранит блокировку для экземпляра MyObject
, который был установлен на _locker
при вызове lock
, то есть он сохранит блокировку для исходного экземпляра _locker
, а не для нового создан MyObject
экземпляр. В следующем коде блокировка будет сохранена на MyObject("OriginalInstance")
при первом вызове lock
. Когда он вызывается во второй раз, он блокируется на MyObject("NewInstance")
.
private static MyObject _locker = new MyObject("OriginalInstance");
...
lock (_locker)
{
...
_locker = new MyObject("NewInstance");
...
}
Следовательно, следующий поток может без проблем войти в критическую секцию, поскольку новый экземпляр не заблокирован.
В любом случае, подобные вещи, как правило, считаются плохой практикой . См. MSDN , где приведены советы по использованию lock
.
.