ConcurrentHashMap的使用注意事項


有人說:雖然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代碼:

 

Map map = Collections.synchronizedMap(new HashMap()); String getString(String name) { synchronized(map){//可保證該同步塊內的所有代碼對map是一個原子操作。 String x = map.get(name); if (x == null) { x = new String(); map.put(name, x); } return x; } }

 

 

雖然說ConcurrentHashMap和synchronizedMap、hashtable在用法上沒有什么太大區別,ConcurrentHashMap是在伸縮性上進行優化,但是它保證了完全的線程安全性:ConcurrentHashMap提供了像CopyOnWriteArrayList的addIfAbsent()方法相似的putIfAbsent(),使程序員能方便的實現檢查然后操作的原子化。

 

因此上述問題屬於程序員編程問題,與ConcurrentHashMap無關

出自:http://topic.csdn.net/u/20090113/16/306cfa54-65ab-44e8-8691-4f963e90ac55.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM