Tôi mất mã DCL từ Joe Duffy của cuốn sách 'lập trình đồng thời trên cửa sổ'Những loại hoạt động 'bay hơi' là cần thiết trong hai lần kiểm tra khóa trong .NET
class LazyInit<T> where T : class
{
private volatile T m_value;
private object m_sync = new object();
private Func<T> m_factory;
public LazyInit(Func<T> factory) { m_factory = factory; }
public T value
{
get
{
if (m_value == null)
{
lock (m_sync)
{
if (m_value == null)
{
m_value = m_factory();
}
}
}
return m_value;
}
}
}
người ta nói đánh dấu m_value dễ bay hơi có thể ngăn chặn viết sắp xếp lại sẽ dẫn đến các chủ đề khác nhận được 'đối tượng không null với các trường chưa được khởi tạo'. Nếu vấn đề xảy ra chỉ bởi vì có thể viết sắp xếp lại, tôi có thể chỉ sử dụng 'Viết dễ bay hơi' thay vì đánh dấu các biến dễ bay hơi, như dưới đây? (Mã này trông một chút lúng túng cho cuộc biểu tình, tôi chỉ muốn chắc chắn nếu chúng ta chỉ có thể sử dụng ghi ổn định thay vì)
class LazyInit<T> where T : class
{
private object m_value;
private object m_sync = new object();
private Func<T> m_factory;
public LazyInit(Func<T> factory) { m_factory = factory; }
public T value
{
get
{
if (m_value == null)
{
lock (m_sync)
{
if (m_value == null)
{
Thread.VolatileWrite(ref m_value, m_factory());
}
}
}
return (T)m_value;
}
}
}
Một câu hỏi có liên quan là phiên bản đan cài từ cuốn sách
class LazylnitRelaxedRef<T> where T : class
{
private volatile T m_value;
private Func<T> m_factory;
public LazylnitRelaxedRef(Func<T> factory) { m_factory = factory; }
public T Value
{
get
{
if (m_value == null)
Interlocked.CompareExchange(ref m_value, m_factory(), null);
return m_value;
}
}
}
Kể từ thông số kỹ thuật ECMA-CLI 'Thao tác liên khóa thực hiện các hoạt động thu nhận/giải phóng tiềm ẩn', chúng ta vẫn cần biến động trong trường hợp này?
Có sự khác biệt quan trọng giữa mô hình bộ nhớ ECMA và mô hình bộ nhớ .net 2. – CodesInChaos
Tại sao bạn cần thực hiện khóa kiểm tra kép? Bạn có quan sát thấy vấn đề hiệu suất với ứng dụng của mình bằng cách lấy khóa không? –
@CodeInChaos, hãy giải thích về "điểm khác biệt quan trọng" là gì. – Amy