java - 以单例模式创建对象时,引用返回什么

标签 java

以下是单例模式的双重检查实现。线程 A 正在执行 test=new Test(); 行,但与此同时,线程 B 首先检查 test 的值。对于线程 B 来说,test 的值是多少?

class Test {
    private Test test;
    private Test() {        
    }   
    public static Test get() {
        if (test == null) {    // Thread B. When object is being created, 
                               // what's value of test. Is it always null before 
                               // Thread B new object?
            synchronized (test.getClass()) {
                if (test == null) {
                    test = new Test(); // Thread A. This thread is creating object.
                }
            }
        }
        return test;
    }
}

已添加
如果不是单例模式的正确版本,volatile关键字可以解决问题吗?即private volatile Test测试;

最佳答案

未知。这就是为什么这个实现被认为是错误的。

有可能 test = new Test() 首先创建对象,然后将对其的引用分配给 test,然后才初始化它。

因此线程B将引用对象,但它可能未初始化。

关于java - 以单例模式创建对象时,引用返回什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46234203/

相关文章:

java - 如何使用 Java 获取 AVI 文件的帧数

c# - 在 C# 点网应用程序中执行 jar 文件

java - Talend:时区 java

java - 从下拉列表中检索值时出现错误

java - Apache Camel 监听器

java - 将 .JAR 和动态加载资源打包到一个 .EXE 中

java - 尝试保存 EditText 时无法暂停

java - Android AlarmManager 执行代码时常无法正常工作

java - Jersey 的@ManagedAsync 注释是什么?

java - 错误包org.python.util不存在,使用ant进行编译