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為切入...