7
正如我知道,有兩種常見的做法,以確保懶初始化的線程安全:在Delphi中實現雙重檢查鎖定是否可能或合理?
- 雙檢鎖(標記變量爲揮發性避免記憶排序)
- InterlockedCompareExchangePointer
看來VCL使用第二種做法。有什麼理由嗎?
class function TEncoding.GetUTF8: TEncoding;
var
LEncoding: TEncoding;
begin
if FUTF8Encoding = nil then
begin
LEncoding := TUTF8Encoding.Create;
if InterlockedCompareExchangePointer(Pointer(FUTF8Encoding), LEncoding, nil) <> nil then
LEncoding.Free;
end;
Result := FUTF8Encoding;
end;
還是有沒有更好的方法?
謝謝!
我不喜歡代碼重複,所以我得到一些想法,可以簡化上述代碼: 1.當PARAM類型「T」具有默認構造 結果:= TUtils.GetInstance(FUTF8Encoding,TUTF8Encoding); 2.使用匿名方法創建本地實例。 結果:= TUtils.GetInstance (FUTF8Encoding, function:TEncoding begin Result:= TUTF8Encoding.Create; end); 那怎麼樣? –
2010-04-14 04:07:38
您應該編輯您的原始帖子,保羅,而不是寫評論。 – gabr 2010-04-14 06:16:58