2012-04-25 28 views
7

Hashmap đồng thời có thể giải quyết vấn đề đồng bộ hóa được nhìn thấy trong băm. Vì vậy, việc thêm và xóa sẽ nhanh nếu chúng ta đang sử dụng công việc khóa đồng bộ hóa với hashmap. Điều gì về kiểm tra kích thước hashmap, nếu mulitple đề kiểm tra concurrentHashMap kích thước? chúng ta vẫn cần từ khóa đồng bộ hóa: một cái gì đó như sau:HashMap đồng thời: kiểm tra kích thước

public static synchronized getSize(){ 
    return aConcurrentHashmap.size(); 
} 

Trả lời

8

concurentHashMap.size() sẽ trả lại kích thước đã biết tại thời điểm cuộc gọi, nhưng có thể là giá trị cũ khi bạn sử dụng số đó vì một chuỗi khác đã thêm/xóa các mục trong thời gian chờ đợi.

Tuy nhiên, toàn bộ mục đích của ConcurrentMaps là bạn không cần phải đồng bộ hóa vì nó là một bộ sưu tập an toàn chỉ.

1

Bạn không cần sử dụng đồng bộ với ConcurretnHashMap ngoại trừ những trường hợp rất hiếm khi bạn cần thực hiện nhiều thao tác nguyên tử.

Để nhận kích thước, bạn có thể gọi nó mà không cần đồng bộ hóa.


Để làm rõ khi tôi sẽ sử dụng đồng bộ hóa với ConcurrentHashMap ...

Giả sử bạn có một đối tượng đắt tiền bạn muốn tạo theo yêu cầu. Bạn muốn đọc đồng thời, nhưng cũng muốn đảm bảo rằng các giá trị chỉ được tạo một lần.

public ExpensiveObject get(String key) { 
    return map.get(key); // can work concurrently. 
} 

public void put(String key, ExepensiveBuilder builder) { 
    // cannot use putIfAbsent because it needs the object before checking. 
    synchronized(map) { 
     if (!map.containsKey(key)) 
      map.put(key, builder.create()); 
    } 
} 

Lưu ý: Điều này yêu cầu tất cả các ghi được đồng bộ hóa, nhưng lần đọc vẫn có thể đồng thời.

+0

ConcurrentHashMap được đồng bộ hóa nội bộ. Việc thêm các khối đồng bộ hóa của riêng bạn lên trên cùng có thể không cung cấp cho bạn những gì bạn muốn. – krock

+0

@krock Bạn phải cẩn thận cách bạn sử dụng nó. Thêm ví dụ. –

2

Bạn chỉ cần gọi aConcurrentHashmap.size(). Tuy nhiên, bạn phải nhớ rằng khi bạn nhận được câu trả lời, nó có thể đã lỗi thời. Điều này sẽ xảy ra nếu một luồng khác để đồng thời sửa đổi bản đồ.

0

Các nhà thiết kế của ConcurrentHashMap nghĩ đến chuyện bỏ weightage đến hoạt động cá nhân như: get(), put()remove() qua phương pháp mà hoạt động trên HashMap hoàn chỉnh như isEmpty() hoặc size(). Điều này được thực hiện bởi vì những thay đổi của các phương thức này được gọi (nói chung) nhỏ hơn các phương thức riêng lẻ khác.

Không cần đồng bộ hóa size() tại đây. Chúng ta có thể lấy kích thước bằng cách gọi phương thức concurentHashMap.size(). Phương thức này có thể trả về các giá trị cũ như luồng khác có thể sửa đổi bản đồ trong khi đó. Tuy nhiên, điều này được giả định rõ ràng là bị phá vỡ khi các hoạt động này được loại bỏ.

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