Конечно, всегда стоит помнить, что Двойная проверка блокировки сломана . Оказывается, эта проблема не относится к модели памяти x86, но о ней всегда стоит помнить в будущем. Я уверен, что в какой-то момент будет версия Delphi, которая будет работать на платформе с моделью памяти, затронутой этой проблемой.
Embarcadero начали использовать версию этого шаблона без блокировки с блокированным сравнением / обменом. Например:
class function TEncoding.GetUnicode: TEncoding;
var
LEncoding: TEncoding;
begin
if FUnicodeEncoding = nil then
begin
LEncoding := TUnicodeEncoding.Create;
if InterlockedCompareExchangePointer(Pointer(FUnicodeEncoding), LEncoding, nil) <> nil then
LEncoding.Free;
end;
Result := FUnicodeEncoding;
end;
Я понимаю, что это не ответ на вопрос, но он не очень подходит для комментария!