“静态最终”单例实例的同步 getter

问题描述 投票:0回答:1

TLDR: 为什么

static final
单例持有者的 getter 需要有
synchronized
修饰符?

Spotbugs'

SING_SINGLETON_GETTER_NOT_SYNCHRONIZED
“SING:使用单例设计模式的类的实例 getter 方法未同步。”)检查,指向 SEI CERT MSC07-J 规则,需要一个
synchronized
getter即使对于
static final
字段也是如此。那就是:

public class MySingleton {

  private static final MySingleton INSTANCE = new MySingleton();

  private MySingleton() {}

  // This method is required to have a `synchronized` modifier.
  // Otherwise, Spotbugs check fails.
  public static synchronized MySingleton getInstance() { return INSTANCE; }

}

有人可以解释一下这里

synchronized
的必要性吗?鉴于
INSTANCE
static final
,我预计不需要同步。

java concurrency spotbugs
1个回答
0
投票

正如此 Spotbugs 票中所解释的,这确实是一个 误报,即 Spotbugs 错误。

synchronized
关键字对于
static final
实例 getter
来说是不需要的。相反,添加
synchronized
关键字会创建同步热点,从而导致可扩展性问题。

© www.soinside.com 2019 - 2024. All rights reserved.