Есть несколько способов создания единственного экземпляра класса. Есть ли смысл использовать в многопоточной среде второй вариант (см. в теме)?
В первом случае будет не очень если 2 потока одновременно потребуют инстанс. Создастся два инстанса.
Второй вариант - классическая реализация для всех языков программирования. В .Net есть более простые способы сделать Singleton.
В С# есть некоторые фичи про которые стоит почитать: инициализация статических конструкторов и типов.
Вам надо это (работает в тредах и даже немного lazy):public sealed class Singleton
{
    public static Singleton Instance { get; } = new Singleton();
    private Singleton() { /* some initialization code */ }
}О синглетоне в С# 6О реализации в C#
Первый-то создаёт, однако…
• Если во время создания напросится другой поток, будут созданы два экземпляра. В «не-мусорных» языках второй экземпляр будет «висеть» и его никак не уничтожишь.
• При определённом устройстве среды исполнения (instance присваивается раньше, чем срабатывает конструктор) система может отдать другому потоку ссылку на неготовый экземпляр.
От создания двух экземпляров второе точно защищает. Я не знаком с моделью памяти C# и потому не могу сказать, насколько второе защищает от неготового экземпляра; кажется, нужен ещё модификатор volatile.