Причина, по которой глобальная переменная отличается от локальной, заключается в том, что LOCK фактически блокирует точку отсчета в мемориале, насколько я понимаю. Каждый раз, когда вы создаете новый объект, то есть «Object obj = new object ();», вы создаете новый объект с его собственным уникальным указателем в памяти. Поэтому, когда LOCK проверяет, заблокирована ли точка в памяти, это не так. Потому что это совершенно новая точка в памяти, и единственное, кто ее использует, это вызывающий абонент, входящий в вашу собственность. Если ваша переменная Obj объявлена глобально, она всегда будет одной и той же точкой в памяти, и блокировка может фактически подтвердить, что действительно эта точка памяти либо заблокирована в настоящий момент, либо может заблокировать ее самостоятельно.
Пример: (грубо, но я думаю, что это правильно)
Object obj = new object();
Теперь у вас есть точка памяти, которая выглядит примерно так:
Память -
* obj1
теперь вы снова вводите свою собственность и снова создаете новый объект. Ваша системная память теперь выглядит примерно так ...
Память -
* obj1
* obj2
Во время первой поездки ваша блокировка проверяет "Obj1" в памяти. Поскольку вызывающий 1-й поездки в вашу собственность является единственным, кто использует этот экземпляр Obj, он единственный, кто когда-либо блокировал или проверял его на предмет блокировки. Потому что он смотрит на эту копию ссылки на Obj в памяти.
Во второй поездке ваша блокировка помечается как «Obj2» в памяти.
Когда вы используете глобальную переменную, эта точка в памяти сохраняется, поэтому блокировка всегда проверяет одну и ту же точку в памяти. он никогда не движется, и это всегда одна и та же ссылка в памяти. Таким образом, все посетители вашей собственности всегда будут использовать одну и ту же точку ссылки в памяти, ваша блокировка будет успешной, как вы ожидаете.
Специальное примечание: я не говорю, что время жизни "obj". Я просто констатирую, как это функционирует в многопоточном процессе. надеюсь, что это поможет.