2012-10-10 24 views
8

Tôi tự hỏi cái nào là cách tiếp cận tốt hơn để tải dữ liệu trong một chuỗi thời trang an toàn. Theo truyền thống, tôi đã sử dụng mẫu khóa kép và phục vụ mục đích khá tốt. Bây giờ, với việc bổ sung các loại System.Lazy, tôi tự hỏi, nếu dựa vào internals của Lazy và Loading là tốt hơn và làm công việc một cách tốt hơn nhiều. Nó trông sạch hơn và dễ đọc hơn nhưng nó có tốt hơn không?C# Luồng & Chặn

Mọi suy nghĩ?

namespace SomeNameSpace 
{ 
    public class DataStoreContext 
    { 
    private readonly static Lazy<DataStoreContext> context = new Lazy<DataStoreContext>(() => new DataStoreContext()); 
    private Lazy<Dictionary<string, Entity>> _entities = new Lazy<Dictionary<string, Entity>>(() => { return DataStoreContext.Instance.Load(); }); 
    private readonly object _syncRoot = new object(); 
    private DataStoreContext() 
    { 
    } 

    public Dictionary<string, Entity> Data 
    { 
     get { return _entities.Value; } 
    } 

    public static DataStoreContext Instance 
    { 
     get { return context.Value; } 
    } 

    private Dictionary<string, Entity> Load() 
    { 
     // Load Data from some data store. 
     return null; 
    } 

    private Dictionary<string, Entity> LoadWithLock() 
    { 
     if (_entities == null) 
     { 
     lock (_syncRoot) 
     { 
      if (_entities == null) 
      { 
      Dictionary<string, Entity> entities = this.Load(); 
      _entities = entities; 
      return _entities; 
      } 
     } 
     } 

     return _entities ; 
    } 

    public void Clear() 
    { 

    _entities = new Lazy<Dictionary<string, Entity>>(() => { return DataStoreContext.Instance.Load(); }); 

    } 
    } 
} 

Trả lời

3

mỗi tài liệu MSDN của:

Theo mặc định, tất cả các thành viên cộng đồng và bảo vệ của lớp Lazy là chủ đề an toàn và có thể được sử dụng đồng thời từ nhiều chủ đề. Những đảm bảo an toàn chủ đề này có thể được loại bỏ tùy ý và mỗi trường hợp, sử dụng các tham số cho các hàm tạo của kiểu.

Đây là một chủ đề khá an toàn cho cả hoạt động đọc và ghi. Vì vậy, tôi sẽ nói với điều này bởi vì nó sạch hơn nhiều.

Nhưng, giống như trạng thái tài liệu, bạn có thể tắt an toàn luồng đó bằng một số tham số tùy chọn cho hàm tạo.

+0

Tôi nhận thấy rằng tôi đã giới thiệu một lỗi mà tôi đã không nạp đúng các thực thể khi yêu cầu Clear() ngay lập tức. Tôi càng nhìn vào nó, tôi càng thích nó. Tôi sẽ bắt đầu sử dụng System.Lazy hơn. Cảm ơn bạn đã nhập. – Sam

+0

@Sam, tôi rất vui vì tôi có thể hỗ trợ. –

8

Nó trông sạch hơn và dễ đọc hơn nhưng tốt hơn không?

Có. Khóa kiểm tra đôi là khó khăn để có được quyền. Nó đòi hỏi một rào cản bộ nhớ là chính xác. Việc triển khai của bạn không thực sự được đảm bảo an toàn bởi CIL *.

Để biết chi tiết, hãy xem this Wikipedia entry.

Bằng cách sử dụng Lazy<T>, bạn nhận được mã không chỉ sạch hơn mà còn thực sự chính xác trên tất cả các nền tảng.

* Lưu ý rằng điều này có khả năng hoạt động hoàn hảo trên x86 và x64, chạy thời gian chạy Microsoft, do mô hình bộ nhớ của nền tảng. Tuy nhiên, nó không được đảm bảo bởi spec là chính xác mà không có rào cản bộ nhớ thích hợp.

+0

OK. Cảm ơn! – Sam