Вопрос: Дорого ли обходиться использовавние lock, зачем делать Singleton with double check locking?

Лучший ответ: зачем делать 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

Худший ответ: зачем делать 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