在concurrenthashmap中读写

时间:2015-10-30 07:31:39

标签: java multithreading concurrenthashmap

我怀疑了并发hashmap。如果conc hashmap的一部分被编写器线程锁定,那么读者线程是否可以同时读取同一部分的hashmap映射?或者它是否需要从作者线程中释放锁?

2 个答案:

答案 0 :(得分:1)

如果您查看ConcurrentHashMap.get()的源代码,那么您可以轻松理解它。

从并发地图中读取时需要

无锁,但如果值为null,则会在readValueUnderLock下再次检查

    get(Object key, int hash) {
         if (count != 0) { // read-volatile
             HashEntry<K,V> e = getFirst(hash);
             while (e != null) {
                 if (e.hash == hash && key.equals(e.key)) {
                     V v = e.value;
                     if (v != null)
                         return v;
                     return readValueUnderLock(e); // recheck
                 }
                 e = e.next;
             }
         }
         return null;
     }

    readValueUnderLock(HashEntry<K,V> e) {
         lock();
         try {
             return e.value;
         } finally {
             unlock();
         }
     }

查看ConcurrentHashMap.put()方法,首先调用lock(),最后调用unlock()

    put(K key, int hash, V value, boolean onlyIfAbsent) {
         lock();
         try {
            ...
         } finally {
             unlock();
         }
     }

答案 1 :(得分:0)

读取时无需锁定。更新地图需要锁定。