码迷,mamicode.com
首页 > 其他好文 > 详细

ConcurrentHashMap的使用注意事项

时间:2017-04-29 01:19:53      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:turn   map   copy   方法   put   ons   sync   http   gets   

有人说:虽然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

ConcurrentHashMap的使用注意事项

标签:turn   map   copy   方法   put   ons   sync   http   gets   

原文地址:http://www.cnblogs.com/sigm/p/6783922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!