Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以同时创建两个实例吗?_Java_Multithreading - Fatal编程技术网

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

Java 可以同时创建两个实例吗?,java,multithreading,Java,Multithreading,接下来的问题是:如果一个对象的构造函数不能同步,这是否意味着不可能同时创建两个实例?例如: public class OutgoingMessage { public OutgoingMessage() { this.creationTime = new Date(); } Date creationTime; } creationDate.getTime()是否总是返回不同的值?我知道多任务/多线程的基础知识,但是多CPU内核呢?在这种情况下,操作系统

接下来的问题是:如果一个对象的构造函数不能同步,这是否意味着不可能同时创建两个实例?例如:

public class OutgoingMessage {
    public OutgoingMessage() {
        this.creationTime = new Date();
    }
    Date creationTime;
}
creationDate.getTime()
是否总是返回不同的值?我知道多任务/多线程的基础知识,但是多CPU内核呢?在这种情况下,操作系统不必切换上下文,还是我错了

如果一个对象的构造函数不能同步,这是否意味着不可能同时创建两个实例

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

public OutgoingMessage(){
   synchronized(this){
      //synchronized constructor
   }
}
但问题是:两个线程究竟如何同时访问同一实例的同一构造函数?根据构造函数如何工作的定义,他们不能。这就是为什么不能在构造函数上同步-因为这没有任何意义


也就是说不是说一个类的两个实例不能同时构造。

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

public class MyClass {
    public MyClass() {
        synchronized(MyClass.class) {
            // Thread unsafe code here!
        }
    }
}
public class MyClass {
    private static final Object LOCK = new Object();

    public MyClass() {
        synchronized(LOCK) {
            // Thread unsafe code here!
        }
    }
}
如果您不想,您不必使用“MyClass.class”,您可以使用一个“LOCK”对象,例如

public class MyClass {
    public MyClass() {
        synchronized(MyClass.class) {
            // Thread unsafe code here!
        }
    }
}
public class MyClass {
    private static final Object LOCK = new Object();

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

你的意思是
creationTime.getDate()
?即使忽略多核
creationTime
对于两个对象也可能是相同的。该对象在构造之前对其他线程不可见这一事实并不意味着无法构造两个对象simulatneously@MiroKropacek在实用程序类中使用同步静态方法。我不相信你真的想这么做,但不知道你在用这个值做什么,很难说;也就是说,你在问问题X,但X不一定是解决你真正问题的最佳途径,Y。为什么你关心两个对象是否可以“同时”创建?您是否不希望两个对象具有相同的
creationTime
?在这种情况下,编写一个静态方法getCreationTimeForNewMessage(),该方法保证不会多次返回相同的时间戳,并从构造函数中调用该方法。或者,如果不是,那么真正的问题是什么?哦,这就是我担心的。专用静态锁对象是否可以用于此目的?@MiroKropacek这确实取决于您正试图执行的操作,但是可以肯定的是,您可以在静态锁对象上进行同步,以将构造函数的部分限制为单个线程。您还可以以BretC在类本身上进行同步为例。