ConcurrentHashMap使用示例

2021-07-07 04:52:01 字數 1438 閱讀 6191

concurrenthashmap是併發效率更高的map,用來替換其他執行緒安全的map容器,比如hashtable和collections.synchronizedmap。實際上,併發執行時,執行緒安全的容器只能保證自身的資料不被破壞,但無法保證業務的行為是否正確。錯誤的理解這裡的執行緒安全,不恰當的使用concurrenthashmap,往往會導致出現問題。

舉個例子:

public static void demo1()  else 

}endlatch.countdown();}};

new thread(task).start();

new thread(task).start();

try catch (exception e)

}

demo1是兩個執行緒操作concurrenthashmap,意圖將value變為10。但是,因為多個執行緒用相同的key呼叫時,很可能會覆蓋相互的結果,造成記錄的次數比實際出現的次數少。

當然可以用鎖解決這個問題,但是也可以使用concurrentmap定義的方法:

v putifabsent(k key, v value)

如果key對應的value不存在,則put進去,返回null。否則不put,返回已存在的value。

boolean remove(object key, object value)

如果key對應的值是value,則移除k-v,返回true。否則不移除,返回false。

boolean replace(k key, v oldvalue, v newvalue)

如果key對應的當前值是oldvalue,則替換為newvalue,返回true。否則不替換,返回false。

於是對demo1進行改進:

public static void demo1() 

} else }}

}endlatch.countdown();

} };

new thread(task).start();

new thread(task).start();

try catch (exception e)

}

由於concurrentmap中不能儲存value為null的值,所以需要處理不存在和已存在兩種情況,不過可以使用atomicinteger來替代。

public static void demo1() 

}oldvalue.incrementandget();

}endlatch.countdown();

} };

new thread(task).start();

new thread(task).start();

try catch (exception e)

}

ConcurrentHashMap 併發雜湊對映

如執行緒1使用put進行新增元素,執行緒2不但不能使用put方法新增元素,並且也不能使用get方法來獲取元素,所以競爭越激烈效率越低。圖1 1 hashtable中在put 方法上加鎖 hashtable容器在競爭激烈的併發環境下表現出效率低下的原因,是因為所有訪問hashtable的執行緒都必須競...

ConcurrentHashMap 原理簡要分析

在之前寫過hashtable 與hashmap 兩者之間的異同 通過前面文章,可以知道hashmap 中未進行同步考慮,而 hashtable 則使用了 synchronized 帶來的直接影響就是可選擇,我們可以在單執行緒時使用 hashmap 提高效率,而多執行緒時用 hashtable 來保證...

ConcurrentHashMap 的原理和結構

concurrenthashmap 是乙個高效的執行緒安全的hashmap,它的加鎖機制和hashtable不同,後者用的是低效的synchronized,前者用的是lock。接著前一期的hashmap,先簡單介紹下concurrenthashmap結構,再以它們的主要函式 put 和 get為切入...