Java ConcurrentHashMap 在内部维护分区。每个分区可以单独锁定。 在某些情况下,多个线程访问的所有键都落在同一个分区中,分区可能没有帮助。 进一步增加分区数应该会提高并发性。
为什么 Java 为分区计数提供默认值 16 而不是非常高的值? Map 中有大量分区时的性能窃听是什么?
最佳答案
Why does Java provides default value for partition count as 16 instead of very high value?
同时使用同一个 CHM 的情况非常少见。如果您真的需要这个,通常有更好的方法来编写您的应用程序来避免这种情况。
例如假设您有 1000 个线程但只有 8 个 CPU。这意味着最多只有 8 个线程将运行并访问 CHM,假设您的程序没有做任何有用的事情,例如其他任何东西。
在实际程序中,一个集合的使用次数很少会超过 10%。这是因为通常涉及一些 IO,或者重组线程以使用它们自己的集合副本并在最后将它们收集在一起是有意义的,例如Map-Reduce
What is the performance overhear with large number of partitions in the Map?
你浪费了一点内存,这无关紧要,但主要是你浪费了一些限制在 32 KB 以内的 L1 缓存和相对宝贵的资源。
关于java - Java ConcurrentHashMap 分区数量增加的缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17233924/