zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    CentOS7学习小记
    PHP的time函数返回时间不正确
    MySQL信息提示不是英文问题
    windows下ITOP安装
    Zend安装
    投资日记2015.6
    解决SecureCRT连接linux超时后断开[转]
    红黑树及生成超过32768随机数
    在宏定义中怎么使用可变参数
    C++堆上申请二维数组
  • 原文地址:https://www.cnblogs.com/sigm/p/6783922.html
Copyright © 2011-2022 走看看