2012-04-25 77 views
7

併發Hashmap可以解決在hashmap中看到的同步問題。因此,如果我們使用hashmap同步密鑰工作,添加和刪除操作將會很快。如果多線程檢查併發HashMap大小,檢查HashMap大小如何?我們還需要synchronzation關鍵字:東西如下:併發HashMap:檢查大小

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

回答

8

concurentHashMap.size()將返回調用時已知的大小,但當您使用該數字時它可能是陳舊值,因爲另一個線程在此期間添加/刪除了項目。

然而,ConcurrentMaps的全部目的是你不需要同步它,因爲它是一個線程安全的集合。

1

你並不需要使用與ConcurretnHashMap除非你需要原子執行多個操作非常罕見的情況下同步。

要獲得大小,您可以在不同步的情況下調用它。


爲了澄清時,我會用與ConcurrentHashMap的同步...

假設您想要創建按需昂貴的對象。您想要併發讀取,但也希望確保只創建一次值。

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()); 
    } 
} 

注意:這要求所有寫操作都是同步的,但讀操作仍然可以併發。

+0

ConcurrentHashMap在內部同步。在頂部添加自己的同步塊可能不會給你想要的。 – krock 2012-04-25 10:24:28

+0

@krock你必須小心如何使用它。添加一個例子。 – 2012-04-25 11:38:51

2

您可以直接致電aConcurrentHashmap.size()。但是,你必須記住,當你得到答案時,它可能已經過時了。如果另一個線程同時修改地圖,則會發生這種情況。

0

的ConcurrentHashMap的設計師認爲就像給權重,以個人操作:在其像isEmpty()size()工作在完整的HashMap的方法get()put()remove()。這是因爲調用這些方法的變化(通常)比其他單獨的方法更少。

此處不需要同步size()。我們可以通過調用concurentHashMap.size()方法來獲得大小。此方法可能會返回陳舊值,因爲其他線程可能會同時修改地圖。但是,由於這些操作的優先順序不明確,因此明確認爲這被打破。