зачем делать Singleton with double check locking
Синглтон имеет смысл делать только тогда, когда (все три):
1. Не факт, что за время работы приложения, понадобится экземпляр этого класса (иначе разруливаем через обычный static)
2. Создавать его очень дорого, и его экземпляр требует много ресурсов (памяти, или может каких-то неуправляемых), по тому его нужно ещё и переиспользовать везде. (иначе зачем в принципе синглтон?)
3. Нет возможности разрулить это на уровне Dependency Injection (иначе разруливаем через DI)
Double check-lock необходим, чтобы гарантировать, что экземпляр синглтона будет создан только 1.
Считается, что создавать экземпляр синглтона дороже, чем 1 лок.
А проверка перед локом нужна затем, чтобы не блокировать лишний раз.
сказали что lock это одна из самых дешевых оперций по синхронизации.
Да, это так. Если гораздо более дорогие операции.
get
{
lock (Loker)
{
// only one check and everything is fine :)
if (_instance == null)
{
_instance = new Singleton1();
}
}
return _instance;
}
А зачем тебе Lock, если ты не собираешься изменять переменную?
Сначала проверяешь на null, чтобы проверить, придётся ли тебе её менять.
Потом поднимаешь lock и проверяешь снова, чтобы гарантировать, что ты один обращаешься.
Для чтения lock не нужен.
Проверка на null - гораздо дешевле, чем lock, по тому перед поднятием блокировки есть смысл проверить на null