Хотя я могу видеть, как вы думаете, это выглядит как блокировка с двойной проверкой, на самом деле это выглядит как опасно сломанная и неправильная блокировка с двойной проверкой .Без фактической реализации SomeDataDoesNotExist и CreateSomeData для критики у нас нет никакой гарантии, что эта штука на самом деле является поточно-ориентированной на каждом процессоре.
В качестве примера анализа того, как блокировка с двойной проверкой может пойти не так, посмотрите эту сломанную и неправильную версию блокировки с двойной проверкой:
C # ручная блокировка / разблокировка
Мой совет: не используйте технику с низким уровнем блокировки без веской причины и обзора кода от эксперта по модели памяти;вы, вероятно, ошибетесь.Большинство людей делают.
В частности, не используйте двойную проверку блокировки, если вы не можете точно описать, какие переупорядочения доступа к памяти могут делать процессоры от вашего имени, и предоставить убедительный аргумент в пользу правильности вашего решения, учитывая любое возможное изменение порядка доступа к памяти .В тот момент, когда вы хотя бы немного отойдете от известной для реализации реализации, вам нужно начать анализ с нуля.Вы не можете предположить, что только потому, что одна реализация двойной проверки блокировки верна, они все таковы;почти ни один из них не является правильным.