【问题标题】:should I must add final keyword when declaring a ConcurrentHashMap in Java [duplicate]在 Java 中声明 ConcurrentHashMap 时我是否必须添加 final 关键字 [重复]
【发布时间】:2021-02-06 03:21:11
【问题描述】:

当我像这样在 Java 8 类中声明 ConcurrentHashMap 时:

private final static ConcurrentHashMap<Long,Integer> signRatioMap = new ConcurrentHashMap();

我发现没有final 它不能正常工作。我应该添加最终关键字吗?有什么优势?

【问题讨论】:

  • 如果你能做一些最终的事情,通常最好这样做,但静态(如这张地图)是一种严重的设计气味; state 应该几乎总是每个实例。

标签: java java-8 final concurrenthashmap


【解决方案1】:

通常,创建变量final 是一种良好的编码习惯,并且还可能带来一些性能优势(有关详细信息,请参阅https://stackoverflow.com/a/4279442/508328)。

但是,在你的情况下,情况略有不同,因为 Java 的 hash map 实现只能扩大其内部结构而永远不会缩小,这导致其扫描性能不断恶化。因此,如果您的地图要经常更改,最好不时重新创建它,在这种情况下,它不能是final

【讨论】:

  • 重新创建地图会破坏ConcurrentHashMap 的目的,因为这不是原子操作,因此不是线程安全的。这就是为什么应该将变量声明为final,以证明作者理解这一点。
  • @Holger 仍然可以在 synchronized 块中完成,但这远远超出了 OP 的原始问题 :-)
  • A synchronized 块仅适用于使用同一对象的 synchronized 块的代码。换句话说,您必须将几乎所有对地图的访问都放入synchronized 块中,如前所述,这会破坏ConcurrentHashMap 的目的。原子更新只有在不与非原子更新混合时才能起作用。
【解决方案2】:

Final 关键字除了防止变量被重新分配之外什么都不做。如果您不需要重新分配变量,请将其设为最终变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2023-03-30
    • 2012-07-16
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多