2010-07-10 22 views

Trả lời

14

According to Microsoft's documentation, lớp Từ điển có thể hỗ trợ đồng thời nhiều người đọc, miễn là bộ sưu tập không bị sửa đổi. Do đó, không yêu cầu khóa.

+2

Không biết tại sao nhiều người không kiểm tra tài liệu. Đây là nơi đầu tiên mọi người nên nhìn. Tại sao hỏi thế giới khi bạn có thể hỏi những người đã viết mã? :) +1 –

+2

@KierenJohnstone Lý do là vì mọi người thường hút về những gì hiệu quả. Các tài liệu đã dạy tôi không nhìn vào chúng ngoại trừ tất cả trừ những thông tin hời hợt nhất. Tôi * đã sử dụng * để tìm kiếm đầu tiên cho các loại câu trả lời này. Bởi vì họ không thường ở đó, tôi không nhìn đầu tiên nữa.(Tôi hỏi Google; Google đưa tôi đến đây; Tôi vui vì Google đã đưa tôi đến đây thay vì tài liệu!) :) – pettys

+0

Tuy nhiên, ai đó đã nhận thấy nhận xét sau trong tài liệu - sau khi "đọc an toàn": "Mặc dù vậy, liệt kê thông qua một bộ sưu tập thực chất không phải là một thủ tục an toàn chỉ. " – dcg

2

Không. Khóa chỉ được yêu cầu khi bạn có khả năng xen kẽ nhiều ghi hoặc viết với lần đọc. Chỉ đọc, không có thay đổi gì cả, không giới thiệu khả năng của một luồng đang làm ảnh hưởng đến những gì một luồng khác đang làm.

Lưu ý rằng điều này không yêu cầu viết gì cả. Nếu, nói rằng, bạn đang sử dụng một đối tượng và đọc nó bằng cách nào đó thay đổi trạng thái bên trong của đối tượng như là một tác dụng phụ, sau đó bạn cần phải có khóa vẫn còn.

+0

Mặc dù đây là tài liệu như là trường hợp cho một đối tượng từ điển cụ thể, điều này là không đúng đối với các đối tượng từ điển nói chung. Hãy tưởng tượng, ví dụ, một đối tượng từ điển khi bạn đọc từ nó, nó sắp xếp lại cấu trúc bên trong của nó sao cho đối tượng được đọc gần đây được chuyển đến trước danh sách thùng băm, để lần sau nó được đọc, nó sẽ nhanh hơn. Nhiều từ điển được viết cho trình biên dịch có thuộc tính này bởi vì nếu bạn tra cứu "WriteLine" bên trong "Console" một lần, tỷ lệ cược là tốt, bạn sắp tìm kiếm nó một lần nữa. Điều đó có nghĩa là lần đọc có thể gây ra các đột biến có thể không phải là luồng an toàn. –

+0

@Eric - công bằng và đúng sự thật. Tôi đã xóa từ "tuỳ chỉnh" khỏi đoạn 2 của tôi vì, như bạn đã chỉ ra, nhiều đối tượng khung làm điều này quá. – Donnie

1

Chỉnh sửa: Có vẻ như tài liệu cho biết lớp này là chủ đề an toàn để đọc. Nhưng nếu không câu trả lời dưới đây vẫn được áp dụng vì bạn không thể giả định chỉ đọc của bạn là chỉ đọc cho lớp.


Câu trả lời ngắn gọn là có. Trừ khi lớp học nói rằng đó là chủ đề an toàn. Có rất nhiều điều nó có thể làm mà không phải là chủ đề an toàn.

Có khả năng nó sẽ không gây ra sự cố nhưng lớp học có thể đang sử dụng các biến nội bộ theo cách có thể gây ra các điều kiện chủng tộc. Nó cũng có thể gọi các lớp khác không phải là luồng an toàn. Trừ khi bạn kiểm tra mã của các tài liệu nói rằng đó là OK sau đó nó không phải là an toàn để giả định.

Ví dụ bạn có thể nghĩ rằng nó chỉ đọc nhưng lớp cố gắng tăng tốc độ có thể lưu vào bộ nhớ cache mục cuối cùng được truy cập có liên quan đến việc ghi dữ liệu. Điều đó có thể thất bại khiến bạn truy xuất một mục khác với dự kiến.

Một lần nữa tôi không nghĩ rằng đó là khả năng ở đây, nhưng trừ khi lớp học nói rằng đó là chủ đề an toàn nó là nguy hiểm để giả định.

+0

Điều này có nghĩa là nếu tôi thay đổi một số thuộc tính của một đối tượng có trong Từ điển tôi có thể có ngoại lệ không? –

+0

Bạn nên KIỂM TRA LỚN, nhưng nhiều bộ sưu tập có thể được đọc đồng thời một cách an toàn ngay cả khi chúng không được gắn nhãn là "an toàn chủ đề". Giả sử nó là nguy hiểm có thể dẫn đến hiệu suất tồi tệ hơn cho hoàn toàn không có được. – Donnie

+0

@ user375487: Bạn sẽ không có khả năng sẽ không nhận được ngoại lệ, nhưng bạn có thể có hành vi kỳ quặc. Bạn nên khóa đối tượng bạn đang thay đổi vì có thể có nhiều hơn một chuỗi có thể cố gắng thay đổi nó cùng một lúc. – Donnie

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