在法线贴图上双重锁定 - 这样安全吗?

时间:2016-12-02 16:12:07

标签: java performance concurrency

大多数访问都是读取,而地图本身会相对较小。那说以下是安全的,我的测试显示结果比ConcurrentHashMap快(至少在1.7x上)。

   volatile Map<String, Object> mapV;

   public Object getV(String key) {
         Object value = mapV.get(key);
         if (value == null) {
                synchronized(this) {
                       value = mapV.get(key);
                       if (value == null) {
                             value = new Object();
                             Map<String, Object> copy = new HashMap<String, Object>();
                             copy.putAll(mapV);
                             copy.put(key, value);
                             mapV = Collections.unmodifiableMap(copy);
                       }
                }
         }
         return value;
   }

1 个答案:

答案 0 :(得分:2)

这将是线程安全的。由于您的地图分配是易失性的,任何看到mapV.get(key) != null的线程都会遇到易失性读取,因此是安全的。

作为编辑:如果这实际上更快或者对于大量数据它会更快,我会感到惊讶。我肯定会使用ConcurrentHashMap代替此实现。