Như tôi được biết, có hai loại phổ biến của thực tiễn để đảm bảo sự an toàn thread lười biếng-khởi:Có thể hoặc hợp lý để thực hiện khóa kiểm tra kép ở Delphi?
- đúp kiểm tra khóa (Marks biến như dễ bay hơi để tránh đặt bộ nhớ)
- InterlockedCompareExchangePointer
Dường như VCL sử dụng phương pháp thứ hai. Có lý do gì không?
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;
hoặc có phương pháp nào tốt hơn không?
Cảm ơn!
Tôi không thích sự trùng lặp mã, vì vậy tôi có một số ý kiến cho rằng có thể đơn giản hóa các mã trên: 1. Khi loại param "T" có constructor mặc định Result: = TUtils.GetInstance (FUTF8Encoding, TUTF8Encoding); 2. Sử dụng một phương thức ẩn danh để tạo một cá thể cục bộ. Kết quả: = TUtils.GetInstance (FUTF8Encoding, chức năng: Mã hóa bắt đầu Kết quả: = TUTF8Encoding.Create; kết thúc); Làm thế nào về điều đó? –
Bạn nên chỉnh sửa bài đăng gốc, Paul, thay vì viết nhận xét. – gabr