V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
guyeuro
V2EX  ›  问与答

Java 里 ConcurrentHashMap 的桶 bucket 的小的话有何弊端?

  •  
  •   guyeuro · 2017-08-23 19:51:14 +08:00 · 1884 次点击
    这是一个创建于 2649 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ConcurrentHashMap 的桶 bucket 越小

    每次锁住的元素就少

    感觉有利于同步性能

    那么弊端是什么?

    4 条回复    2017-08-23 21:31:10 +08:00
    gejun123456
        1
    gejun123456  
       2017-08-23 20:54:13 +08:00 via Android
    占用内存大,扩容时慢
    guyeuro
        2
    guyeuro  
    OP
       2017-08-23 21:10:44 +08:00
    @gejun123456 为何占内存大?
    yidinghe
        3
    yidinghe  
       2017-08-23 21:13:25 +08:00 via Android
    “ HashTable 容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问 HashTable 的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是 ConcurrentHashMap 所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。”

    欲知进一步详情,请看 http://www.infoq.com/cn/articles/ConcurrentHashMap/
    xiaxiaocao
        4
    xiaxiaocao  
       2017-08-23 21:31:10 +08:00 via iPhone
    锁力度小主要是求 size,rehash 这些操作会开销更大。事实上 Java8 的 CHM 实现已经是到 slot 这个锁粒度了,size 都是一个类似于 LongAdder 的结构来单独记录
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2729 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:27 · PVG 19:27 · LAX 03:27 · JFK 06:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.