标签: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代码:
虽然说ConcurrentHashMap和synchronizedMap、hashtable在用法上没有什么太大区别,ConcurrentHashMap是在伸缩性上进行优化,但是它保证了完全的线程安全性:ConcurrentHashMap提供了像CopyOnWriteArrayList的addIfAbsent()方法相似的putIfAbsent(),使程序员能方便的实现检查然后操作的原子化。
因此上述问题属于程序员编程问题,与ConcurrentHashMap无关。
出自:http://topic.csdn.net/u/20090113/16/306cfa54-65ab-44e8-8691-4f963e90ac55.html
标签:turn map copy 方法 put ons sync http gets
原文地址:http://www.cnblogs.com/sigm/p/6783922.html