Что вы ожидаете случиться при первом обращении к свойству Instance
до того, как получите объект для блокировки?
(Подсказка: lock(null)
срывается ...)
Как отдельная мера, я почти всегда избегаю блокировки "фактического объекта" - потому что обычно может быть другой код, которому подвергается эта ссылка, и я не обязательно знаю, что будет блокироваться,Даже если ваша версия сработала , что произойдет, если какой-нибудь внешний код напишет:
// Make sure only one thread is ever in this code...
lock (Singleton.Instance)
{
// Do stuff
}
Теперь никто другой не сможет даже получить экземпляр, пока этот кодвыполняется, потому что они будут заблокированы в получателе.Блокировка в геттере не предназначена для защиты от этого - она предназначена только для защиты от множественного доступа внутри геттера .
Чем крепче вы можете контролировать свои замкичем проще рассуждать о них и избегать тупиков.
I очень редко блокирует "нормальный" объект, если:
- Iя не выставляю эту ссылку за пределы этого класса
- Я уверен, что сам тип (который всегда будет иметь ссылку на
this
, конечно) не будет блокироваться сам по себе.
(Все это является причиной, по которой, конечно, тоже не стоит блокировать this
...)
По сути, я считаю, что идея разрешить вам блокировку любого объекта была плохой идеей.в Java, и это было плохим шагом, чтобы скопировать его в .NET: (