Спецификация Common Language Infrastructure гарантирует, что «инициализатор типа должен запускаться ровно один раз для любого данного типа, если это явно не вызвано кодом пользователя». (Раздел 9.5.3.1.) Таким образом, если у вас нет какого-то дурацкого IL на вызове Singleton ::. Cctor напрямую (маловероятно), ваш статический конструктор будет работать ровно один раз перед использованием типа Singleton, будет создан только один экземпляр Singleton и ваше свойство Instance является поточно-ориентированным.
Обратите внимание, что если конструктор Singleton обращается к свойству Instance (даже косвенно), то свойство Instance будет иметь значение null. Лучшее, что вы можете сделать, - это обнаружить, когда это произойдет, и выдать исключение, проверив, что этот экземпляр не равен нулю в методе доступа к свойству. После завершения статического конструктора свойство Instance будет иметь ненулевое значение.
Как ответ Zoomba указывает, что вам необходимо сделать Singleton безопасным для доступа из нескольких потоков или внедрить механизм блокировки с использованием экземпляра singleton.