如何让Constructor theadsafe?

How to make the Constructor theadsafe?

我可以使 Class 的构造函数成为线程安全的吗?不允许使用关键字 synchronized? 我不想创建一个变量,我在其中保护对象的 "State" 并检查每个方法 ..

示例:

    public class Main2 {

    static TestClass object;

    public static void main(String[] args) {
        new Thread() {
            public void run() {
                object = new TestClass();
            };
        }.start();

        new Thread() {
            public void run() {
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                object.printValue();
            }
        }.start();
    }
}



   class TestClass {

    private int value;

    public TestClass() {
        System.out.println("Start Constructor");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Finished Constructor");

        this.value = 5;
    }

    public void printValue() {
        System.out.println("Value: \"" + this.value + "\"");
    }
}

输出:

Start Constructor
Exception in thread "Thread-1" java.lang.NullPointerException
    at Main2.run(Main2.java:19)
Finished Constructor

有什么想法吗?

使用工厂模式。

将构造函数设为私有并添加 public 构造对象的静态同步方法。

像那样:http://www.javapractices.com/topic/TopicAction.do?Id=21

这与对象内部的线程安全无关。对象在您访问之前未创建。

您正在访问一个空对象。一个简单的空检查就可以解决问题。