【问题标题】:concurrent HashMap: checking size并发 HashMap:检查大小
【发布时间】:2012-04-25 10:10:29
【问题描述】:

Concurrent Hashmap 可以解决在 hashmap 中看到的同步问题。因此,如果我们使用带 hashmap 的同步键工作,添加和删除会很快。如果有多个线程检查 concurrentHashMap 大小,那么检查 hashmap 大小呢?是否还需要同步关键词:如下:

public static synchronized getSize(){
     return aConcurrentHashmap.size();
}  

【问题讨论】:

    标签: java concurrency concurrenthashmap


    【解决方案1】:

    concurentHashMap.size() 将返回调用时已知的大小,但当您使用该数字时它可能是一个陈旧的值,因为同时另一个线程已添加/删除项目。

    但是 ConcurrentMaps 的全部目的是您不需要同步它,因为它是一个线程安全的集合。

    【讨论】:

      【解决方案2】:

      您可以直接拨打aConcurrentHashmap.size()。但是,您必须记住,当您得到答案时,它可能已经过时了。如果另一个线程同时修改地图,就会发生这种情况。

      【讨论】:

        【解决方案3】:

        您不需要将同步与 ConcurretnHashMap 一起使用,除非在极少数情况下您需要以原子方式执行多个操作。

        要获取大小,您可以在不同步的情况下调用它。


        澄清何时使用 ConcurrentHashMap 进行同步...

        假设您想要按需创建一个昂贵的对象。您需要并发读取,但也希望确保值只创建一次。

        public ExpensiveObject get(String key) {
            return map.get(key); // can work concurrently.
        }
        
        public void put(String key, ExepensiveBuilder builder) {
            // cannot use putIfAbsent because it needs the object before checking.
            synchronized(map) {
                if (!map.containsKey(key))
                    map.put(key, builder.create());
            }
        }
        

        注意:这要求所有写入都是同步的,但读取仍然可以并发。

        【讨论】:

        • ConcurrentHashMap 在内部同步。在顶部添加您自己的同步块可能无法满足您的需求。
        • @krock 你必须小心你如何使用它。添加示例。
        【解决方案4】:

        ConcurrentHashMap 的设计者考虑将权重分配给单独的操作,例如:get()put()remove(),而不是像 isEmpty()size() 这样对完整 HashMap 进行操作的方法。这样做是因为(通常)调用这些方法的更改少于其他单个方法。

        这里不需要size() 的同步。我们可以通过调用concurentHashMap.size() 方法获取大小。此方法可能会返回过时的值,因为其他线程可能会同时修改映射。但是,由于这些操作的优先级被取消,因此明确假定这已被打破。

        【讨论】:

          【解决方案5】:

          ConcorrentHashMap 是故障安全的。它不会给出任何并发修改异常。它适用于多线程操作。 ConcurrentHashMap 的整个实现与 HashMap 相同,但在检索元素时,HashMap 会锁定整个映射,限制进行进一步修改,从而导致并发修改异常。 但是在 ConcurrentHashMap 中,锁定发生在桶级别,因此不存在并发修改异常的机会。

          所以在这里回答你的问题,检查 ConcurrentHashMap 的大小并没有帮助,因为它会根据你在地图上编写的操作或修改代码保持链接。它具有与 HashMap 相同的 size 方法。

          【讨论】:

            猜你喜欢
            • 2018-12-15
            • 1970-01-01
            • 1970-01-01
            • 2019-05-28
            • 1970-01-01
            • 2017-08-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多