2015-04-23 2 views
5

Вид следующего вопроса: Why can't Java constructors be synchronized?: если конструктор объекта не может быть синхронизирован, значит ли это, что невозможно создать два экземпляра буквально в одно и то же время? Например:Могут ли быть созданы два экземпляра одновременно?

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

бы creationDate.getTime() всегда возвращает другое значение? Я знаю об основах многозадачности/многопоточности, но что касается нескольких ядер процессора? В этом случае операционной системе не нужно переключать контексты, или я здесь не прав?

+0

вы имели в виду 'creationTime.getDate()' ? – RaGe

+0

Даже игнорирование многоядерного 'creationTime' все равно может быть одинаковым для двух объектов. –

+3

Тот факт, что объект не виден другим потокам, пока он не сконструирован, не означает, что 2 объекта не могут быть построены simulatneously – njzk2

ответ

7

Если конструктор объекта не может быть синхронизирован, значит ли это, что невозможно создать два экземпляра буквально в одно и то же время?

№ Как ответы в другом вопросе, конструктор не может быть синхронизирован просто потому, что ничего не существует для синхронизации до того, как вызывается конструктор. Вы могли бы сделать что-то вроде этого:

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

Но тогда возникает вопрос: как на земле будет два потока доступ к тем же конструктор одного и того же экземпляра в то же время? Они не могли, по самому определению, как работают конструкторы. Вот почему вы не можете синхронизировать конструктор, потому что это не имеет никакого смысла.

Это не говоря, что два экземпляры класса не могут быть построены одновременно.

+0

О, о, чего я боялся. Будет ли частный статический объект блокировки работать для этой цели? –

+0

@MiroKropacek На самом деле это зависит от того, что вы пытаетесь сделать, но, конечно, вы можете синхронизировать объект статической блокировки, чтобы ограничить части вашего конструктора единственным потоком. Вы также можете взять пример синхронизации BretC в самом классе. –

1

Если вы хотите, чтобы убедиться, что блок кода внутри конструктора никогда не выполняется более чем одной нити в то же время, вы можете синхронизировать на классе, к примеру ...

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! 
     } 
    } 
} 
Смежные вопросы