TLDR: 为什么
static final
单例持有者的 getter 需要有 synchronized
修饰符?
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
,我预计不需要同步。
正如此 Spotbugs 票中所解释的,这确实是一个 误报,即 Spotbugs 错误。
synchronized
关键字对于 static final
实例 getter 来说是不需要的。相反,添加 synchronized
关键字会创建同步热点,从而导致可扩展性问题。