java - 不正确的延迟初始化

标签 java findbugs

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/

相关文章:

eclipse - 如何在eclipse中卸载插件?

java - 有类似FindBugs之类的工具吗?

java - 在Applet中调用JavaScript中的JavaObject

java - 在业务层返回业务验证结果的首选方法是什么

java - 请放心 - 无法序列化,因为无法确定如何序列化内容类型

java - 多线程java的完整执行时间

java - 简单日期格式

java - 可能的 FindBugs 误报 UL_UNRELEASED_LOCK_EXCEPTION_PATH?

java - 如何抑制 FindBugs 警告(对绝对路径名的硬编码引用)?

java - 解码 [] 字节我只得到字符�����