2013-11-27 4 views
7

Ist es wirklich möglich, ein teilweise konstruiertes Objekt in dem Thread zu sehen, der im Konstruktor erstellt wurde, wegen der fehlenden Synchronisation und dem Lecken dieser Instanz?Gibt es vor dem Programm Reihenfolge Regel funktioniert in Konstruktoren?

Außer für den Fall, wenn ein Kind Klasse ist natürlich, oder wir tun implizite Konstruktion mit Klon oder so ähnlich - so nehmen wir an, dass die Klasse letzte und ist es vollständig in den Thread calling initialisiert ist der Konstruktor vor dem Aufruf eines anderen Threads.

Wie ich verstehe die folgende hb() Regeln gelten,

  • Jede Aktion in einem Thread geschieht zuvor jede Aktion in diesem Thread , die später in der Reihenfolge des Programms (Programm Bestell-Artikel)

    kommt
  • Ein Aufruf von start() in einem Thread geschieht vor allen Aktionen im gestarteten Thread.

  • Wenn hb (x, y) und hb (y, z), dann hb(x, z)

ist es also bedeuten, dass der folgende Code technisch Thread-sicher ist (ich habe es aus der ähnlichen Frage genommen Why shouldn't I use Thread.start() in the constructor of my class?, gibt es auch eine ähnliche Frage Why it is bad practice to create a new thread on constructors?, ps hoffe ich diese wird man nicht als Duplikat geschlossen)

final class SomeClass 
{ 
    public ImportantData data = null; 
    public Thread t = null; 

    public SomeClass(ImportantData d) 
    { 
     t = new MyOperationThread(); 

     // t.start(); // Footnote 1 

     data = d; 

     t.start(); // Footnote 2 
    } 
} 

PS offensichtlich Daten Feld fehlt Verkapselung hier, aber diese Frage ist über die Zustand Sichtbarkeit des Objekts von Thread t.

+1

In der Praxis sollten Sie in Ordnung sein, in der Theorie Aufruf von 'this.data' in der run-Methode des Threads ist nicht definiert, da' this' möglicherweise noch nicht initialisiert ist. – assylias

+0

Ihr Codebeispiel verweist auf Fußnoten. Wo sind sie? – meriton

+0

Die Fußnoten sind eigentlich in der Frage, auf die ich mich beziehe. stackoverflow.com/questions/11834173/why-shouldnt-i-use-thread-start-in-the-constructor-of-my-class –

Antwort

3

Ja, tut es. Die Spezifikation eindeutig writes:

Eine Aktion, die einen Thread startet, synchronisiert mit der ersten Aktion im Thread es beginnt.

Natürlich wird ein Objekt nicht als vollständig initialisierten garantiert, wenn ein Konstruktor abgeschlossen ist, weil Konstrukteure andere Konstrukteure aufrufen können - entweder durch eine explicit constructor invocation statement, oder weil ein Super Standardkonstruktors wird implizit aufgerufen. Daher ist das Lecken von this von einem Konstruktor eher fragil - mit einem einzelnen oder mehreren Threads.

Verwandte Themen