有人說:雖然ConcurrentHashMap是線程安全的,但是在如下的代碼中:
ConcurrentHashMap<String,String> map;
String getString(String name) {
String x = map.get(name);
if (x == null) {
x = new String();
map.put(name, x);
}
return x;
}
如果你只調用get(),或只調用put()時,ConcurrentHashMap是線程安全的。
但是,在你調用完get后,調用put之前,如果有另外一個線程調用了map.put(name, x),你再去執行map.put(name,x),就很可能把前面的操作結果覆蓋掉了。所以,即使在線程安全的情況下,你還是有可能違反原子操作的規則。
於是有人就提出不采用ConcurrentHashMap這個類,而是采用如下的java代碼:
雖然說ConcurrentHashMap和synchronizedMap、hashtable在用法上沒有什么太大區別,ConcurrentHashMap是在伸縮性上進行優化,但是它保證了完全的線程安全性:ConcurrentHashMap提供了像CopyOnWriteArrayList的addIfAbsent()方法相似的putIfAbsent(),使程序員能方便的實現檢查然后操作的原子化。
因此上述問題屬於程序員編程問題,與ConcurrentHashMap無關。
出自:http://topic.csdn.net/u/20090113/16/306cfa54-65ab-44e8-8691-4f963e90ac55.html