ConcurrentHashMap的示例

时间:2010-11-02 17:05:15

标签: java concurrenthashmap

我正在阅读文章“Java theory and practice: Building a better HashMap”,该文章概述了ConcurrentHashMap的实现。

我还在Stackoverflow here上找到了一些讨论。

我怀疑在我的脑海里是“使用ConcurrentHashMap的场景/应用程序/场所是什么”。

谢谢

3 个答案:

答案 0 :(得分:6)

您可以在使用ConcurrentHashMap的相同实例中使用HashMap,除非您使用地图计划多个线程。

答案 1 :(得分:2)

我使用它来快速查找用户ID到多线程服务器中的用户对象。

我有一个网络线程,一个用于定期任务的计时器线程和一个用于处理控制台输入的线程。多个线程访问用户的哈希映射,因此它需要是线程安全的。

答案 2 :(得分:2)

对于大型地图或大量读写操作,建议使用ConcurrentHashMap,因为:

  • 从地图上阅读时,它没有被锁定。因此,如果有5个线程从中读取,则所有线程都可以同时从地图读取。
  • 写入时,仅锁定相关记录(键)。因此,如果5个线程正在写入不同键的值,则所有这些操作可以同时发生。但是,如果2个线程正在写入相同的密钥,则这些操作是线程安全的。之所以发生这种情况,是因为在对象(映射)级别没有锁定,但是在更精细的粒度上 - 在散列图桶级别。

考虑以下示例:

public class ConcurrentHashMapExample {

    public static void main(String[] args) {

        //ConcurrentHashMap
        Map<String,String> myMap = new ConcurrentHashMap<String,String>();
        myMap.put("1", "1");
        myMap.put("2", "1");
        myMap.put("3", "1");
        myMap.put("4", "1");
        myMap.put("5", "1");
        myMap.put("6", "1");
        System.out.println("ConcurrentHashMap before iterator: "+myMap);
        Iterator<String> itr1 = myMap.keySet().iterator();

        while(itr1.hasNext()){
            String key = itr1.next();
            if(key.equals("3")) myMap.put(key+"new", "new3");
        }
        System.out.println("ConcurrentHashMap after iterator: "+myMap);

        //HashMap
        myMap = new HashMap<String,String>();
        myMap.put("1", "1");
        myMap.put("2", "1");
        myMap.put("3", "1");
        myMap.put("4", "1");
        myMap.put("5", "1");
        myMap.put("6", "1");
        System.out.println("HashMap before iterator: "+myMap);
        Iterator<String> itr2 = myMap.keySet().iterator();

        while(itr2.hasNext()){
            String key = itr2.next();
            if(key.equals("3")) myMap.put(key+"new", "new3");
        }
        System.out.println("HashMap after iterator: "+myMap);
    }
}

输出将是:

ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1}
ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1}
HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1}
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
    at java.util.HashMap$KeyIterator.next(HashMap.java:828)
    at com.test.ConcurrentHashMapExample.main(ConcurrentHashMapExample.java:44)

正如您所看到的,对于HashMap,将抛出ConcurrentModificationException,因为您尝试更改当前正在迭代的地图! (具体而言,将在声明中抛出异常:String key = itr1.next();