併發Hashmap可以解決在hashmap中看到的同步問題。因此,如果我們使用hashmap同步密鑰工作,添加和刪除操作將會很快。如果多線程檢查併發HashMap大小,檢查HashMap大小如何?我們還需要synchronzation關鍵字:東西如下:併發HashMap:檢查大小
public static synchronized getSize(){
return aConcurrentHashmap.size();
}
併發Hashmap可以解決在hashmap中看到的同步問題。因此,如果我們使用hashmap同步密鑰工作,添加和刪除操作將會很快。如果多線程檢查併發HashMap大小,檢查HashMap大小如何?我們還需要synchronzation關鍵字:東西如下:併發HashMap:檢查大小
public static synchronized getSize(){
return aConcurrentHashmap.size();
}
concurentHashMap.size()
將返回調用時已知的大小,但當您使用該數字時它可能是陳舊值,因爲另一個線程在此期間添加/刪除了項目。
然而,ConcurrentMaps的全部目的是你不需要同步它,因爲它是一個線程安全的集合。
你並不需要使用與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());
}
}
注意:這要求所有寫操作都是同步的,但讀操作仍然可以併發。
您可以直接致電aConcurrentHashmap.size()
。但是,你必須記住,當你得到答案時,它可能已經過時了。如果另一個線程同時修改地圖,則會發生這種情況。
的ConcurrentHashMap的設計師認爲就像給權重,以個人操作:在其像isEmpty()
或size()
工作在完整的HashMap的方法get()
,put()
和remove()
。這是因爲調用這些方法的變化(通常)比其他單獨的方法更少。
此處不需要同步size()
。我們可以通過調用concurentHashMap.size()
方法來獲得大小。此方法可能會返回陳舊值,因爲其他線程可能會同時修改地圖。但是,由於這些操作的優先順序不明確,因此明確認爲這被打破。
ConcurrentHashMap在內部同步。在頂部添加自己的同步塊可能不會給你想要的。 – krock 2012-04-25 10:24:28
@krock你必須小心如何使用它。添加一個例子。 – 2012-04-25 11:38:51