tôi chạy vào một số mã singleton ngày hôm nay trong codebase của chúng tôi và tôi đã không chắc chắn nếu những điều sau đây là thread-safe:Atomicity của C# coalescing hành
public static IContentStructure Sentence{
get {
return _sentence ?? (_sentence = new Sentence());
}
}
Tuyên bố này là tương đương với:
if (_sentence != null) {
return _sentence;
}
else {
return (_sentence = new Sentence());
}
Tôi tin rằng ?? chỉ là một thủ thuật biên dịch và mã kết quả vẫn không phải là nguyên tử. Nói cách khác, hai hoặc nhiều luồng có thể tìm thấy _sentence là null trước khi thiết lập _sentence thành một câu mới và trả về nó.
Để đảm bảo tính nguyên tố, chúng tôi phải khóa mà bit mã:
public static IContentStructure Sentence{
get {
lock (_sentence) { return _sentence ?? (_sentence = new Sentence()); }
}
}
Có phải đó là tất cả có đúng không?
http://csharpindepth.com/Articles/General/Singleton.aspx – SLaks
Ngoại trừ việc bạn không thể khóa thứ gì đó không có giá trị, vì vậy giải pháp của bạn sẽ không bao giờ hoạt động. – vcsjones
điểm tốt. Phải, bạn phải tạo một vật thể khác để khóa. Nắm bắt tốt. – Adam