Với ví dụ cụ thể:
static final Map FOO = Collections.unmodifiableMap(new HashMap());
Sau đó FOO sẽ không thay đổi. Nó cũng sẽ không bao giờ có bất kỳ yếu tố nào.Với trường hợp chung chung hơn:
static final Map BAR = Collections.unmodifiableMap(getMap());
Sau đó, điều này là không thay đổi hoàn toàn phụ thuộc vào việc người khác có thể vào Bản đồ cơ bản hay không và loại bản đồ nào. Ví dụ, nếu nó là một LinkedHashMap thì danh sách liên kết bên dưới có thể được sửa đổi theo thứ tự truy cập, và có thể thay đổi bằng cách gọi get(). Cách an toàn nhất (sử dụng các lớp học không đồng thời) để làm điều này sẽ là:
static final Map BAR = Collections.unmodifiableMap(new HashMap(getMap()));
các javadocs for HashMap ngụ ý rằng chừng nào bạn thực hiện không thay đổi cấu trúc bản đồ, sau đó nó là an toàn để sử dụng nó đồng thời, vì vậy đây nên an toàn cho bất kỳ người truy cập nào mà bạn có thể sử dụng, đó là nhận các tập hợp khác nhau và lặp lại chúng và nhận() sau đó sẽ an toàn.
Nếu bạn có thể sử dụng các lớp học đồng thời, sau đó bạn cũng có thể làm:
static final Map BAR = Collections.unmodifiableMap(new ConcurrentHashMap(getMap());
Đây sẽ là một cách rõ ràng an toàn để sử dụng từ nhiều chủ đề, từ ConcurrentHashMap là rõ ràng multi-thread an toàn truy cập. Trạng thái bên trong có thể có thể thay đổi, nhưng trạng thái hiển thị bên ngoài sẽ không được, và vì lớp được đảm bảo là luồng an toàn, chúng ta có thể xem xét nó một cách an toàn bên ngoài.
Nguồn
2010-01-15 21:18:32
Thực ra là một câu hỏi hay. Hãy suy nghĩ 'WeakHashMap' - có thể thay đổi mà không thay đổi. 'LinkedHashMap' trong chế độ truy cập là giống nhau. –
(Bạn có thể muốn sao chép tiêu đề câu hỏi của mình vào câu hỏi - biểu ngữ bị mù.) –
Tác giả có một câu hỏi hay. Giả sử tôi viết triển khai bản đồ của riêng tôi. Hãy giả sử rằng khi mỗi lần tra cứu, nó sẽ tổ chức lại cấu trúc bên trong của nó để hầu hết các mục được tìm kiếm nhanh hơn trong thời gian tới. Kết thúc tốt đẹp của người dùng đã nói bản đồ với bộ sưu tập không thể sửa đổi và giả định đó là chủ đề an toàn. Sau đó, 2 chủ đề truy cập các giá trị khác nhau cùng một lúc và vít tối ưu hóa nội bộ lên trạng thái bên trong của bản đồ. – z5h