Tôi có một từ điển được điền một lần trong một hàm dựng tĩnh và vẫn không thay đổi kể từ đó. Tôi muốn nhiều chủ đề có thể đọc các giá trị từ bộ sưu tập này. Tôi có cần khóa ở đây không?C# đọc đa luồng các bộ sưu tập không thể sửa đổi
Trả lời
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.
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.
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. –
@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
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.
Đ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? –
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
@ 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
- 1. Bộ sưu tập sửa đổi mục
- 2. Micro-benchmark so sánh các bộ sưu tập Scala có thể thay đổi được với các bộ sưu tập java.util.concurrent. *
- 3. Bộ sưu tập đã được sửa đổi, hoạt động liệt kê không thể thực hiện
- 4. Cách đọc Bộ sưu tập ManagementObject trong WMI bằng C#
- 5. Sửa đổi Bộ sưu tập giản đồ SQL Server
- 6. C++ đồng bộ đa luồng
- 7. Bộ sưu tập không có thứ tự cho các đối tượng không thể sửa được?
- 8. C# Đặt bộ sưu tập?
- 9. Sửa đổi bộ sưu tập khi sử dụng vòng lặp foreach trong C#
- 10. Đọc tập tin txt với đa luồng trong python
- 11. C# ngăn ngừa Bộ sưu tập đã được sửa đổi ngoại trừ
- 12. Entity Framework chỉ đọc các bộ sưu tập
- 13. Đọc tập tin nhanh nhất trong ứng dụng đa luồng
- 14. Chế độ xem có thể sửa đổi Java trên bộ sưu tập
- 15. C# Tôi có thể sửa đổi các biến của Request.Form không?
- 16. PowerShell - Liệt kê thông qua bộ sưu tập và thay đổi bộ sưu tập
- 17. bộ sưu tập Return như read-only
- 18. Bộ sưu tập MongoDB có thể có bên trong bộ sưu tập khác không?
- 19. Đa luồng một tệp lớn đọc
- 20. C bộ sưu tập # thuộc tính
- 21. Các khái niệm về sửa đổi phần tử trong bộ sưu tập khi đang lặp?
- 22. Có bất kỳ bộ sưu tập C# nào mà sửa đổi không làm mất hiệu lực vòng lặp không?
- 23. Bộ sưu tập khung thực thể đã được sửa đổi; hoạt động điều tra có thể không thực thi
- 24. Hoạt động không được hỗ trợ trên bộ sưu tập chỉ đọc C# wp7
- 25. Tại sao tôi nhận được "Bộ sưu tập đã được sửa đổi; hoạt động điều tra có thể không thực thi" khi không sửa đổi bộ sưu tập được liệt kê?
- 26. Bộ sưu tập đồng thời không chặn?
- 27. Sắp xếp lại bộ sưu tập C#
- 28. C# Bộ sưu tập rác Bộ rễ hoạt động
- 29. Lọc bộ sưu tập trong C#
- 30. C# generics và bộ sưu tập
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 –
@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
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