2012-05-14 23 views
7

Tôi đã đọc ở đâu đó trong ConcurrentHashMap, toàn bộ đối tượng bản đồ không bị khóa và thay vào đó, khóa được tạo trên một phần của Bản đồ.ConcurrentHashMap khóa

Ai đó có thể giải thích khi nào khóa có ảnh không?

Có đúng khi đọc Bản đồ không có khóa liên quan đến nó nhưng trong khi cập nhật thì chỉ khóa được sử dụng?

+3

bài viết này sẽ trợ giúp: http://www.ibm.com/developerworks/java/library/j-jtp08223/ – yegor256

+1

[javadoc] (http://docs.oracle.com/javase/7/docs/ api/java/util/concurrent/ConcurrentHashMap.html) khá chi tiết trong việc giải thích việc triển khai. – trutheality

Trả lời

12

Có, ConcurrentHashMap sử dụng nhiều khóa, mỗi khóa sẽ điều khiển một đoạn mã băm.

Khi đặt dữ liệu trong một phân khúc cụ thể, bạn sẽ nhận được khóa cho phân khúc đó.

Khi nhận dữ liệu, đọc linh hoạt được sử dụng. Nếu kết quả đọc dễ bay hơi dẫn đến lỗi, thì khóa cho đoạn được lấy cho lần thử cuối cùng khi đọc thành công.

+1

Tôi đã không nhận được "nếu nếu đọc biến động kết quả trong một miss, sau đó khóa cho phân khúc thu được cho một nỗ lực cuối cùng tại một thành công đọc". Bạn có thể giải thích ít chi tiết không? – Anand

+1

@anand Theo JMM có thể ghi dễ bay hơi của một trường trong hàm khởi tạo có thể hiển thị cho các chủ đề sau khi đối tượng kết thúc xây dựng và hiển thị với các chủ đề khác (điều này không đúng đối với các trường cuối cùng). Khóa ông đề cập đến sẽ đảm bảo xảy ra - trước khi đặt hàng của wrt viết wratile khác đọc. Lưu ý: Điều này đã có thể xảy ra, tuy nhiên có thể không bao giờ có và tôi đã đọc trong Java 6 không bao giờ có thể - đã có nói chuyện của chỉ cần loại bỏ nó vì tất cả sự nhầm lẫn. –

+2

Và chỉ để làm cho hoàn thành xây dựng rõ ràng đề cập đến mục nhập của xô. –

5

Việc khóa được giảm thiểu tối đa có thể trong khi vẫn an toàn trên luồng.

Để giải thích "một phần bản đồ bị khóa", điều này có nghĩa là khi cập nhật, chỉ có "1/concurrencyLevel" của Bản đồ (dựa trên mã băm của khóa) bị khóa. Điều này có nghĩa là hai bản cập nhật vẫn có thể thực hiện đồng thời một cách an toàn nếu chúng ảnh hưởng đến từng nhóm riêng biệt, do đó giảm thiểu sự tranh chấp khóa và tối đa hóa hiệu suất.

Quan trọng hơn, hãy tin tưởng việc triển khai JDK - bạn không cần phải lo lắng về chi tiết triển khai trong JDK (vì một điều, nó có thể thay đổi từ khi phát hành sang bản phát hành). Thay vào đó, chỉ cần tập trung vào viết của bạn.

+0

Khi bạn liên kết Hashtable, bạn có nghĩa là ConcurrentHashMap. Giải thích của bạn là không chính xác. Toàn bộ thể hiện Hashtable được đồng bộ hóa cho mọi sửa đổi hoặc đọc. –

+0

@JohnVint Cảm ơn. Tôi đã cập nhật câu trả lời của mình. – Bohemian

+0

@trutheality Cảm ơn. Tôi đã sửa lại câu trả lời của mình. – Bohemian

0

ConcurrentHashMap sử dụng cơ chế Khóa Reentrant. ConcurrentHashMap sử dụng phân đoạn thay vì xô và khi bản ghi mới nhận khóa chèn sẽ chỉ nhận được trên phân khúc không phải là danh sách đầy đủ các phân đoạn. Vì vậy, ở đây ý tưởng làm cho rõ ràng rằng khóa đa cấp sẽ nhận được trên cùng một.

Vì không có mức độ tương tranh nào được đặt thành mức độ khám phá, ConcurrentHashMap được chia thành 16 phân đoạn. Và mỗi phân đoạn hoạt động như một HashMap độc lập.

Không có khóa nào được áp dụng cho thao tác đọc trong ConcurrentHashMap.

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