2012-12-03 33 views
7

Tôi đang tìm kiếm một từ điển chỉ đọc được truy cập từ nhiều chuỗi. Trong khi ConcurrentDictionary cho thấy khả năng như vậy, tôi không muốn có phí trên và API lạ.Tại sao ReadOnlyDictionary không an toàn?

.Net 4.5 trong khi cung cấp một lớp như vậy, tài liệu chỉ ra rằng chỉ các cuộc gọi tĩnh là an toàn.

Tôi tự hỏi tại sao?

+0

Sao chép từ tài liệu Microsoft: Toàn bộ chủ đề an toàn và có thể được sử dụng đồng thời từ nhiều chủ đề. –

+3

@KenCheung: Không rõ tại sao nhận xét của bạn có liên quan. Câu hỏi chỉ ra rằng OP đã nhận thức được 'ConcurrentDictionary <,>', nhưng hỏi về sự an toàn của 'ReadOnlyDictionary <,>'. –

Trả lời

8

ReadOnlyDictionary chỉ là trình bao bọc xung quanh bất kỳ từ điển nào khác. Như vậy, nó chỉ an toàn với luồng như từ điển cơ bản.

Cụ thể, nếu có một chủ đề sửa đổi từ điển cơ bản trong khi một chủ đề khác đọc từ trình bao bọc, không có sự đảm bảo an toàn.

Nếu bạn muốn có một ReadOnlyDictionary đó là một cách hiệu quả bất biến từ tất cả góc, bạn có thể tạo một bản sao của từ điển gốc, tạo một wrapper ReadOnlyDictionary xung quanh đó, và sau đó không giữ một tham chiếu đến các bản sao bất cứ nơi nào. Chỉ với chỉ hoạt động đọc đang diễn ra, thao tác này sẽ an toàn theo luồng. Tất nhiên, nếu các loại khóa hoặc giá trị có thể thay đổi, điều đó sẽ mở ra một mức độ thứ hai là "không an toàn theo chủ đề" để lo lắng.

+0

Tôi cũng nghĩ vậy. Cảm ơn. – Mouk

+3

Chỉ cần làm rõ. Chỉ đọc không ngụ ý thread-safe. Điều gì xảy ra nếu từ điển sắp xếp lại các mục dựa trên việc sử dụng đã đọc? Các từ điển BCL không làm điều đó (AFAIK) nhưng tôi đọc ở đâu đó mà Scripting.Dictionary di chuyển mục đọc cuối cùng đến vị trí đầu tiên trong thùng. – adrianm

+1

@adrianm: Vâng, đó là sự thật. Nhưng bạn có thể bọc một 'System.Collections.Generic.Dictionary' mà không bao giờ sửa đổi, và * that * sẽ không sao. –

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