2009-08-18 25 views

Trả lời

64

Synchronized HashMap:

  1. Mỗi phương pháp được đồng bộ bằng một khóa cấp độ đối tượng. Vì vậy, các phương thức get và put trên synchMap có được một khóa.

  2. Khóa toàn bộ bộ sưu tập là chi phí hiệu suất. Trong khi một chủ đề giữ trên khóa, không có chủ đề nào khác có thể sử dụng bộ sưu tập.

ConcurrentHashMap đã được giới thiệu trong JDK 5.

  1. Không có khóa ở cấp đối tượng, Các khóa đang ở granularity mịn hơn nhiều. Đối với một ConcurrentHashMap, các khóa có thể ở cấp độ băm băm.

  2. Tác động của khóa cấp thấp hơn là bạn có thể có người đọc đồng thời và người viết không thể cho bộ sưu tập được đồng bộ hóa. Điều này dẫn đến khả năng mở rộng hơn nhiều.

  3. ConcurrentHashMap không ném ConcurrentModificationException nếu một chủ đề cố gắng sửa đổi trong khi một chuỗi khác đang lặp qua nó.

Bài viết này Java 7: HashMap vs ConcurrentHashMap là một nội dung rất tốt. Rat khuyen khich.

+3

Vì vậy, sự khác nhau giữa 'Hashtable' và' HashMap 'được đồng bộ hóa là gì? – roottraveller

+0

Giữa ConcurrentHashMap và HashMap đã đồng bộ hóa, bạn nên giới thiệu cái nào? – Blunderchips

76

Câu trả lời ngắn:

Cả hai bản đồ là triển khai thread-safe của giao diện Map. ConcurrentHashMap được triển khai để có thông lượng cao hơn trong trường hợp có thể xảy ra đồng thời cao.

Brian Goetz article theo ý tưởng đằng sau ConcurrentHashMap là một nội dung rất tốt. Rat khuyen khich.

+0

Đây là gì? HashMap: Lưu ý rằng điều này thực hiện không đồng bộ để ngăn chặn tình cờ truy cập không đồng bộ vào bản đồ: 'Bản đồ m = Collections.synchronizedMap (new HashMap (...)); ' http: // docs. oracle.com/javase/7/docs/api/java/util/HashMap.html – karate

+3

"Bài viết của Brian Goetz ... là một bài đọc rất hay." - Và thậm chí nhiều hơn nữa là cuốn sách "Java Concurrency in Practice" của anh ấy. –

24

ConcurrentHashMap là chủ đề an toàn mà không đồng bộ hóa toàn bộ bản đồ. Đọc có thể xảy ra rất nhanh trong khi viết được thực hiện với một khóa.

5

ConcurrentHashMap sử dụng cơ chế khóa chi tiết hơn được gọi là lock stripping để cho phép mức độ truy cập chia sẻ lớn hơn. Do đó, nó cung cấp đồng thời tốt hơnkhả năng mở rộng.

Cũng lặp lại cho ConcurrentHashMapyếu phù hợp thay vì thất bại nhanh chóng kỹ thuật sử dụng bởi đồng bộ HashMap.

2

Phương pháp trên SynchronizedMap giữ khóa trên đối tượng, trong khi ở ConcurrentHashMap có khái niệm "khóa dải" nơi khóa được giữ trên nhóm nội dung thay thế. Do đó cải thiện khả năng mở rộng và hiệu suất.

1

ConcurrentHashMap:

1) Cả hai bản đồ là triển khai thread-safe của giao diện bản đồ.

2) ConcurrentHashMap được triển khai cho thông lượng cao hơn trong trường hợp xảy ra đồng thời cao.

3) Không có khóa ở cấp độ đối tượng.

đồng bộ Hash Bản đồ:

1) Mỗi ​​phương pháp được đồng bộ bằng một khóa cấp độ đối tượng.

7

Cả hai đều là phiên bản được đồng bộ hóa của HashMap, với sự khác biệt về chức năng cốt lõi của chúng và cấu trúc bên trong của chúng.

ConcurrentHashMap bao gồm các phân đoạn nội bộ có thể được xem dưới dạng Khái niệm HashMaps độc lập. Tất cả các phân đoạn như vậy có thể được khóa bằng các luồng riêng biệt trong các lần thực hiện đồng thời cao. Vì vậy, nhiều chủ đề có thể nhận/đặt các cặp khóa-giá trị từ ConcurrentHashMap mà không bị chặn/chờ đợi lẫn nhau. Điều này được thực hiện cho thông lượng cao hơn.

trong khi

Collections.synchronizedMap(), chúng tôi nhận được một phiên bản đồng bộ của HashMap và nó được truy cập trong việc ngăn chặn cách. Điều này có nghĩa là nếu nhiều luồng cố gắng truy cập vào bản đồ đồng bộ cùng một lúc, chúng sẽ được phép nhận/đặt các cặp khóa-giá trị một tại một thời điểm theo cách đồng bộ.

5

Chúng tôi có thể đạt được an toàn luồng bằng cách sử dụng cả ConcurrentHashMap và synchronisedHashmap. Nhưng có rất nhiều sự khác biệt nếu bạn nhìn vào kiến ​​trúc của họ.

  1. synchronisedHashmap

Nó sẽ duy trì các khóa ở cấp đối tượng. Vì vậy, nếu bạn muốn thực hiện bất kỳ thao tác nào như put/get thì bạn phải lấy khóa trước. Đồng thời, các chủ đề khác không được phép thực hiện bất kỳ thao tác nào. Vì vậy, tại một thời điểm, chỉ có một sợi có thể hoạt động trên điều này. Vì vậy, thời gian chờ đợi sẽ tăng lên ở đây. Chúng tôi có thể nói rằng hiệu suất là tương đối thấp khi bạn so sánh với ConcurrentHashMap.

  1. ConcurrentHashMap

Nó sẽ duy trì các khóa ở cấp phân khúc. Nó có 16 phân đoạn và duy trì mức đồng thời là 16 theo mặc định. Vì vậy, tại một thời điểm, 16 chủ đề có thể hoạt động trên ConcurrentHashMap. Hơn nữa, hoạt động đọc không yêu cầu khóa. Vì vậy, bất kỳ số lượng các chủ đề có thể thực hiện một hoạt động có được trên nó.

Nếu thread1 muốn thực hiện thao tác đặt trong phân đoạn 2 và luồng2 muốn thực hiện thao tác đặt trên phân đoạn 4 thì nó được phép ở đây. Có nghĩa là, 16 chủ đề có thể thực hiện cập nhật (đặt/xóa) hoạt động trên ConcurrentHashMap cùng một lúc.

Vì vậy, thời gian chờ đợi sẽ ít hơn ở đây. Do đó hiệu suất là tương đối tốt hơn so với SynchronisedHashmap.

0

ConcurrentHashMap cho phép truy cập đồng thời dữ liệu. Toàn bộ bản đồ được chia thành các phân đoạn.

Đọc hoạt động tức là. get(Object key) không được đồng bộ ngay cả ở cấp phân đoạn.

Nhưng viết hoạt động tức là. remove(Object key), get(Object key) lấy khóa ở cấp phân đoạn. Chỉ một phần của toàn bộ bản đồ bị khóa, các chủ đề khác vẫn có thể đọc các giá trị từ các phân đoạn khác nhau ngoại trừ một đoạn bị khóa.

Bản đồ đồng bộ mặt khác, lấy khóa ở mức đối tượng. Tất cả các chuỗi nên đợi chuỗi hiện tại bất kể hoạt động (Đọc/Ghi).

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