java hashmap读,java – ConcurrentHashmap – 读取和删除
你是對的.如果這個Map可以被多個線程修改,那么對chm.get(key)的第一次調用可能會返回一個非null值,而第二次調用將返回null(由于從Map完成的Map中刪除了鍵)另一個線程),因此chm.get(key).doSomething()將拋出一個NullPointerException.
您可以使用局部變量來存儲chm.get(key)的結果,從而使此代碼線程安全:
ConcurrentHashMap chm = new ConcurrentHashMap();
Integer value = chm.get(key);
if(value != null) {
value.doSomething(); // P.S. Integer class doesn't have a doSomething() method
// but I guess this is just an example of calling some arbitrary
// instance method
chm.remove(key);
}
順便說一句,即使Map不是ConcurentHashMap并且只有一個線程可以訪問它,我仍然使用局部變量,因為它比調用get()方法兩次更有效.
編輯:
如下面所述,此修復程序不會阻止doSomething()被不同的線程多次調用相同的鍵/值.這是否是所期望的行為并不清楚.
如果您希望防止多個線程為同一個鍵/值調用doSomething()的可能性,您可以使用chm.remove(key)來刪除鍵并在同一步驟獲取值.
然而,這會冒一些鍵/值根本不會執行doSomething()的風險,因為如果第一次調用doSomething()導致異常,則不會再由另一個線程調用doSomething(),因為鍵/值對將不再出現在Map中.另一方面,如果僅在doSomething()成功執行后從Map中刪除鍵/值對,則保證doSomething()至少成功執行一次,以便從Map中重新發送所有鍵/值對.
總結
以上是生活随笔為你收集整理的java hashmap读,java – ConcurrentHashmap – 读取和删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql pt_MySQL慢查询之pt
- 下一篇: c语言空格键么 有什么意义,C语言里这个