Обычно он вызывается только один раз. То есть, если у вас нет состояния гонки.
Допустим, два потока выполняют этот оператор одновременно:
EntityMapper<ServerMappingStrategy>.CurrentStrategy.ToString();
Допустим, поток A будет работать до currentStrategy == null
, но останавливается до new T()
, когда Windows внезапно передает управление потоку B , который затем снова выполняет сравнение currentStrategy
по-прежнему равен нулю, вызывает конструктор и присваивает новый экземпляр currentStrategy
. Затем в какой-то момент Windows возвращает элемент управления потоку A , который снова вызывает конструктор. Это важно, потому что обычно статические члены (как бы) должны быть потокобезопасными. Так что на вашем месте я бы обернул этот бит в lock
предложение.
P.S. этот фрагмент не будет компилироваться, так как T может быть структурой, которая не может быть нулевой. Вместо сравнения с нулем сравните со значением по умолчанию (T) или укажите, что T должен быть классом.