Это блокирует только на время получения / установки; конечно, во многих общих случаях это все равно будет атомарным, просто из-за размера данных.
Однако в действительности большинство блокировок должно охватывать больше, чем это, точно так же, как коллекции, блокирующие только добавление и т. Д., Мало помогают - вызывающему обычно требуется одна блокировка, чтобы охватить «есть ли это? так что обновите, иначе добавьте "последовательность.
Для чего-то такого простого, как bool, "volatile" может решить проблему намного проще - особенно если это просто для выхода из цикла.
Возможно, вы также захотите рассмотреть [MethodImpl (MethodImplOptions.Synchronized)] - хотя лично я предпочитаю частный объект блокировки (как вы использовали), чтобы предотвратить проблемы с внешними людьми, блокирующими объект (вышеизложенное использует «this» как замок).
Для модульного тестирования вам понадобится что-то, чтобы сначала доказать, что оно сломано - что будет сложно, поскольку операции настолько малы (и уже атомарны для большинства типов данных). Одной из других вещей, которых он избегает (что также изменяет volatile), является кэширование в регистре, но, опять же, это оптимизация, которую сложно заставить доказать, что она не работает.
Если вас интересует обёртка, вы можете рассмотреть существующий код, например this .