在Java中声明ConcurrentHashMap时是否必须添加final关键字

在Java中声明ConcurrentHashMap时是否必须添加final关键字,java,java-8,final,concurrenthashmap,Java,Java 8,Final,Concurrenthashmap,当我在Java 8类中声明一个ConcurrentHashMap时,如下所示: private final static ConcurrentHashMap<Long,Integer> signRatioMap = new ConcurrentHashMap(); private final static ConcurrentHashMap signRatioMap=new ConcurrentHashMap(); 我发现没有final它就不能正常工作。我应该添加最后的关键字吗?

当我在Java 8类中声明一个
ConcurrentHashMap
时,如下所示:

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

我发现没有
final
它就不能正常工作。我应该添加最后的关键字吗?优点是什么?

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

通常,将变量设为最终变量是一种良好的编码实践,也可能会带来一些性能优势(有关详细信息,请参阅)


然而,在您的例子中,情况略有不同,因为Java对哈希映射的实现只能增加其内部结构,而不会缩小,这会导致其扫描性能的持续恶化。因此,如果你的地图经常被更改,最好时不时地重新创建它,在这种情况下,它不可能是最终的,如果你能使某个东西成为最终的,通常最好这样做,但是静态(像这个地图)是一种严重的设计气味;状态应该几乎总是每个实例。重新创建映射会破坏
ConcurrentHashMap
的目的,因为这不是原子操作,因此不是线程安全的。这就是为什么变量应该声明为
final
,以证明作者理解这一点。@Holger仍然可以在
synchronized
块中完成,但这远远超出了OP最初的问题:-)一个
同步的
块只会对使用同一对象的
同步的
块起作用。换句话说,您必须将几乎所有对映射的访问放入
synchronized
块中,如上所述,这将破坏
ConcurrentHashMap
的用途。原子更新仅在未与非原子更新混合时才能工作。