2010-10-20 30 views
13

Tôi cần tạo một danh sách các mục an toàn chỉ để thêm vào chỉ mục lucene.Xếp hàng an toàn (danh sách) trong .net

Chủ đề sau có an toàn không?

public sealed class IndexQueue 
{ 
    static readonly IndexQueue instance = new IndexQueue(); 
    private List<string> items = new List<string>(); 

    private IndexQueue() { } 

    public static IndexQueue Instance { 
     get { return instance; } 
    } 

    private object padlock = new object(); 

    public void AddItem(string item) { 
     lock (padlock) { 
      items.Add(item); 
     } 
    } 
} 

Cần khóa ngay cả khi nhận các mục từ danh sách nội bộ?

Ý tưởng là sau đó chúng tôi sẽ có một nhiệm vụ riêng biệt chạy để lấy các mục từ indexqueue và thêm chúng vào chỉ mục lucene.

Cảm ơn Bến

+2

Có các chủ đề an toàn trong .NET 4 (nếu bạn thậm chí có thể sử dụng 4), không chắc liệu bạn có biết hay không, như tôi thấy bạn đang cuộn ... http: //msdn.microsoft.com /en-us/library/system.collections.concurrent.aspx –

+0

Xin cảm ơn các bạn. Sẽ có một cái nhìn tại System.Collections.Concurrent –

+0

Tôi không nghĩ rằng 'System.Collections.Concurrent' sẽ hữu ích cho bạn. Không có 'List' tương đương và thậm chí nếu có bạn vẫn có thể phải áp dụng khóa của riêng bạn để làm cho việc liệt kê các mục là nguyên tử.Nó thực sự phụ thuộc vào cách bạn muốn liệt kê được cảm nhận bởi nhiều chủ đề. –

Trả lời

37

Việc triển khai của bạn có vẻ an toàn theo chủ đề, mặc dù bạn cũng sẽ cũng cần khóa khi đọc từ items - bạn không thể đọc an toàn nếu có hoạt động Add đồng thời. Nếu bạn bao giờ liệt kê, bạn sẽ cần khóa xung quanh đó là tốt và điều đó sẽ cần phải sống miễn là điều tra viên.

Nếu bạn có thể sử dụng .net 4, tôi thực sự khuyên bạn nên xem không gian tên System.Collections.Concurrent. Nó có một số bộ sưu tập tốt được kiểm tra và khá hiệu quả được thread-an toàn và trong thực tế tối ưu hóa xung quanh truy cập nhiều luồng.

+8

+1 cho 'System.Collections.Concurrent' –

4

Có cần phải khóa ngay cả khi nhận được các mục từ danh sách nội bộ?

Lớp danh sách không an toàn khi bạn sửa đổi. Cần phải khóa nếu:

  • Bạn sử dụng một phiên bản duy nhất của lớp từ nhiều chủ đề.
  • Nội dung của danh sách có thể thay đổi khi bạn đang sửa đổi hoặc đọc từ danh sách.

Có lẽ điều đầu tiên là đúng nếu không bạn sẽ không đặt câu hỏi. Điều thứ hai là rõ ràng đúng bởi vì phương pháp Add sửa đổi danh sách. Vì vậy, có, bạn cần nó.

Khi bạn thêm phương thức vào lớp cho phép bạn đọc lại các mục cần khóa, và quan trọng là bạn phải sử dụng cùng một đối tượng khóa như bạn đã làm trong AddItem.

2

Có; trong khi truy xuất không phải là hoạt động không an toàn không hoạt động, nếu bạn cũng đang viết vào danh sách, thì bạn có nguy cơ bị truy xuất ở giữa quá trình ghi.

Điều này đặc biệt đúng nếu điều này sẽ hoạt động giống như hàng đợi truyền thống, nơi truy xuất thực sự sẽ xóa giá trị đã truy xuất khỏi danh sách.

Các vấn đề liên quan