2012-02-19 29 views
6

Tôi có cấu trúc dữ liệu Bản đồ được chia sẻ cần phải an toàn chỉ. Được đồng bộ hóa cách hiệu quả nhất để đọc hoặc thêm vào Bản đồ?Cách hiệu quả nhất để tạo cấu trúc dữ liệu an toàn cho chủ đề (Java)

Cảm ơn!

Chỉnh sửa: Cấu trúc dữ liệu là bộ nhớ cache không thể cập nhật, tức là khi nó đã được lấp đầy, nó sẽ không cập nhật bộ nhớ cache. Vì vậy, rất nhiều viết ban đầu với một số lần đọc sau đó nó chủ yếu là đọc

Trả lời

6

"hiệu quả nhất" là tương đối, tất nhiên, và phụ thuộc vào tình hình cụ thể của bạn. Nhưng hãy xem xét một cái gì đó như ConcurrentHashMap nếu bạn mong đợi có nhiều chủ đề làm việc với bản đồ cùng một lúc; đó là chuỗi an toàn nhưng vẫn cho phép truy cập đồng thời, không giống như Hashtable hoặc Collections.synchronizedMap().

0

phương pháp hoặc bộ sưu tập được đồng bộ hóa chắc chắn sẽ hoạt động. Nó không phải là cách tiếp cận hiệu quả nhất nhưng rất đơn giản để thực hiện và bạn sẽ không nhận thấy chi phí, trừ khi bạn truy cập vào cấu trúc hàng triệu lần mỗi giây.

Một ý tưởng tốt hơn mặc dù có thể là sử dụng ConcurrentHashMap - điều này được thiết kế để đồng thời ngay từ đầu và nên hoạt động tốt hơn trong một tình huống rất đồng thời.

3

Điều đó tùy thuộc vào cách bạn sử dụng trong ứng dụng.

Nếu bạn đang thực hiện nhiều lần đọc và viết trên đó, ConcurrentHashMap có thể là lựa chọn tốt nhất, nếu nó chủ yếu là đọc, một Bản đồ chung được bao bọc bên trong bộ sưu tập bằng cách sử dụng ReadWriteLock (vì ghi sẽ không phổ biến, bạn 'd được truy cập nhanh hơn và chỉ khóa khi viết).

Collections.synchronizedMap() có thể là trường hợp xấu nhất, vì nó có thể chỉ cung cấp cho bạn một trình bao bọc với tất cả các phương thức được đồng bộ hóa, tránh nó bằng mọi giá.

1

Đối với trường hợp sử dụng cụ thể của bạn (bộ đệm không thể cập nhật), một bản sao trên bản đồ ghi sẽ hoạt động tốt hơn cả bản đồ đồng bộ và ConcurrentHashMap.

Xem: https://labs.atlassian.com/wiki/display/CONCURRENT/CopyOnWriteMap là một ví dụ (tôi tin rằng apache cũng có bản sao về triển khai bản đồ ghi).

+0

Liên kết dường như đã thay đổi thành - https://bitbucket.org/atlassian/atlassian-util-concurrent/wiki/CopyOnWrite%20Maps –

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