Why can't Java constructors be synchronized?的后续问题:如果对象的构造函数无法同步,这是否意味着无法在字面上同时创建两个实例?例如:
public class OutgoingMessage {
public OutgoingMessage() {
this.creationTime = new Date();
}
Date creationTime;
}
creationDate.getTime()
总是会返回不同的值吗?我知道多任务/多线程的基础知识但是多CPU核心呢?在这种情况下,操作系统不必切换上下文,或者我错了吗?
答案 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!
}
}
}