Findbug 告诉我我使用了不正确的延迟初始化。
public static Object getInstance() {
if (instance != null) {
return instance;
}
instance = new Object();
return instance;
}
我在这里没有发现任何问题。是 findbug 的错误行为,还是我遗漏了什么?
最佳答案
Findbug 引用了一个潜在的线程问题。在多线程环境中,可能会使用当前代码多次创建单例。
阅读量很大here ,但它有助于解释。
这里的竞争条件在 if 检查
上。在第一次调用时,一个线程将进入 if check
,并将创建实例并将其分配给“实例”。但是在 if 检查
和实例创建/分配之间有可能另一个线程变得活跃。这个线程也可以通过 if check
因为分配还没有发生。因此,将创建两个(或更多,如果有更多线程进入)实例,并且您的线程将引用不同的对象。
关于java - 不正确的延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6782660/