当前位置: 首页 > 面试题库 >

Java ConcurrentHashMap在性能方面胜过HashMap?

拓拔嘉颖
2023-03-14
问题内容

我刚读了《清洁代码》一书,就发现了以下说法:

Java很小的时候,Doug Lea撰写了开创性的书[8]
Java的并行编程。他与这本书一起开发了几个线程安全的集合,这些集合后来成为该java.util.concurrent包中JDK的
一部分。该软件包中的集合对于多线程情况是安全的,并且它们表现良好。 实际上,ConcurrentHashMap 几乎所有情况下
,该 实现都比HashMap更好 。它还允许同时进行并发读写,并且它具有支持常见复合操作的方法,这些方法否则不是线程安全的。如果Java
5是部署环境,请从 ConcurrentHashMap

请注意,在上面的引文中,我使用“ [n]”(其中n是一些数字)来表示作者提供参考的位置,并且您可以看到他没有为粗体部分提供任何参考。

不是说我不相信这个声明,而是我想知道这个声明的支持证据。因此,没有人知道任何资源,显示性能统计信息都ConcurrentHashMapHashMap?或者有人可以向我解释为什么ConcurrentHashMap比HashMap更快?

休息一下,我可能会在工作中研究ConcurrentHashMap的实现,但是现在,我想听听SOers同事的回答。


问题答案:

道格·李(Doug Lea)在这些事情上非常擅长,因此,如果他的ConcurrentyHashMap表现一次超过约书亚·布洛赫(Joshua
Bloch)的表现,我不会感到惊讶HashMap。但是从Java 7开始,的第一个@author也HashMap已成为Doug
Lea。显然,现在没有任何理由HashMap比它的并表堂要慢。

出于好奇,我还是做了一些基准测试。我在Java
7下运行它。条目越多,性能越接近。最终ConcurrentHashMap在的3%之内HashMap,这非常了不起。俗话说,瓶颈是内存访问,“内存是新磁盘(而磁盘是新磁带)”。如果条目在高速缓存中,则两者都会很快。如果条目不适合缓存,则两者都会变慢。在实际的应用程序中,地图不必很大就可以与其他人竞争驻留在缓存中。如果经常使用地图,则将其缓存;如果不是,则不对其进行缓存,这才是真正的决定性因素,而不是实现(鉴于这两者都是由同一位专家实现的)

public static void main(String[] args)
{
    for(int i = 0; i<100; i++)
    {
        System.out.println();

        int entries = i*100*1000;
        long t0=test( entries, new FakeMap() );
        long t1=test( entries, new HashMap() );
        long t2=test( entries, new ConcurrentHashMap() );

        long diff = (t2-t1)*100/(t1-t0);
        System.out.printf("entries=%,d time diff= %d%% %n", entries, diff);
    }
}


static long test(int ENTRIES, Map map)
{
    long SEED = 0;
    Random random = new Random(SEED);

    int RW_RATIO = 10;

    long t0 = System.nanoTime();

    for(int i=0; i<ENTRIES; i++)
        map.put( random.nextInt(), random.nextInt() );

    for(int i=0; i<RW_RATIO; i++)
    {
        random.setSeed(SEED);
        for(int j=0; j<ENTRIES; j++)
        {
            map.get( random.nextInt() );
            random.nextInt();
        }
    }
    long t = System.nanoTime()-t0;
    System.out.printf("%,d ns %s %n", t, map.getClass());
    return t;
}


static class FakeMap implements Map
{
    public Object get(Object key)
    {
        return null;  
    }
    public Object put(Object key, Object value)
    {
        return null;  
    }
    // etc. etc.
}


 类似资料:
  • 自我介绍 手撕力扣,给定一个字符串,从多到少,输出每一次字符出现的次数(降序) 1.这个项目现在在用部署过吗 2.sql语句casewhen使用过吗 3.linux指令awk知道吗 4.docker镜像打包发布指令 5.微服务用过那些组件 6.在学习当中遇到的困难怎么解决的(说了一个项目的困难js的bug会造成精度丢失)有没有别的解决方案 7.了解过大数据么hadoop 8.工厂模式了解么 9.静

  • Apache2.0是一个多用途的web服务器,其设计在灵活性、可移植性和性能中求得平衡。虽然没有在设计上刻意追求性能指标,但是Apache2.0仍然在许多现实环境中拥有很高的性能。 相比于Apache 1.3 ,2.0版本作了大量的优化来提升处理能力和可伸缩性,而且大多数的改进在默认状态下就可以生效。但是,在编译时和运行时,都有许多可以显著提高性能的选择。本文阐述在安装Apache2.0时,服务器

  • 问题内容: 在我们的项目中,我们必须在Spring JDBCTemplate和Hibernate之间做出选择。 我想知道在 性能,实现和设计 方面哪个更好 。 如何? 问题答案: 如果您尽一切努力使这两个实现都非常快,那么JDBC模板可能会更快一些,因为它没有Hibernate的开销。但是可能要花更多的时间和代码行来实现。 Hibernate具有其学习曲线,您必须了解幕后发生的情况,何时使用投影而

  • 问题内容: 我只是意识到我需要在一个方面同步大量的数据收集代码,但是性能才是真正的问题。如果性能下降太多,我的工具将被丢弃。我将分别将int和long写入各种数组,ArrayList和Map。应用程序将有多个线程将进行功能调用,这将由我的方面进行介绍。我应该注意什么样的事情会对性能产生负面影响?哪种代码模式更有效? 特别是我有一种方法可以调用许多其他数据记录方法: 这些方法通常会添加纵横比字段的增

  • 我有这张桌子: 这是我的SQL查询: 我想要的查询是: > 我希望获得符合某些条件的记录,特别是字段在最近24小时内的记录 我需要获得紧接在#1中的记录之前的记录 将#1中的结果进一步过滤到其价格列在记录的历史记录中具有不同值(而不是-1)的记录 我面临的问题是查询太慢了。我有一百万张唱片。执行查询大约需要2分钟。我猜GROUP BY会使查询变慢。我想我需要做一个综合指数,但我不知道怎么做。 解释

  • 结果 过了,拿到offer 时间 2023.3.13 心得 题目 讲一下你做过的业务? 总结过 数据库层面的性能问题排查过吗? 讲一下遇到的慢sql 怎么查询慢sql? 又是这个问题 mysql查看执行计划的方式有几种? 先记住 explain 关键字吧。 jdk1.8的新特性可以说一下吗? 总结过 localDate和Date的区别是什么? 总结过 stream流可以收集多次吗? stream属