可以同时创建两个实例吗?

时间:2015-04-23 16:40:19

标签: java multithreading

Why can't Java constructors be synchronized?的后续问题:如果对象的构造函数无法同步,这是否意味着无法在字面上同时创建两个实例?例如:

public class OutgoingMessage {
    public OutgoingMessage() {
        this.creationTime = new Date();
    }
    Date creationTime;
}

creationDate.getTime()总是会返回不同的值吗?我知道多任务/多线程的基础知识但是多CPU核心呢?在这种情况下,操作系统不必切换上下文,或者我错了吗?

2 个答案:

答案 0 :(得分:7)

  

如果对象的构造函数无法同步,这是否意味着无法在字面上同时创建两个实例?

没有。作为另一个问题状态的答案,构造函数不能简单地同步,因为在调用构造函数之前没有任何东西可以同步。你可以这样做:

public OutgoingMessage(){
   synchronized(this){
      //synchronized constructor
   }
}

但问题变成了:两个线程如何同时访问相同实例的相同构造函数?根据构造函数的工作原理,他们无法做到。这就是为什么你不能在构造函数上同步 - 因为它没有任何意义。

表示无法同时构建类的两个实例。

答案 1 :(得分:1)

如果要确保构造函数中的代码块不会同时由多个线程执行,则可以在Class上进行同步,例如......

public class MyClass {
    public MyClass() {
        synchronized(MyClass.class) {
            // Thread unsafe code here!
        }
    }
}

你不必使用" MyClass.class"如果你不想,你可以拥有一个" LOCK"对象,例如......

public class MyClass {
    private static final Object LOCK = new Object();

    public MyClass() {
        synchronized(LOCK) {
            // Thread unsafe code here!
        }
    }
}