Java: Caching von nicht-volatile-Variablen von verschiedenen threads

Die situation ist folgende:

  1. Ich habe ein Objekt mit viel setter und Getter.
  2. Instanz dieses Objekts erstellt wird, in einem bestimmten thread, wo alle Werte eingestellt sind. Zunächst erstelle ich ein "leeres" Objekt mithilfe von new-Anweisung und nur dann rufe ich einige setter-Methoden basiert auf einem komplizierten Erbe, die Logik.
  3. Nur dann ist dieses Objekt verfügbar geworden ist, auf alle anderen threads, die verwenden nur Getter.

Die Frage: muss ich machen, damit alle Variablen dieser Klasse flüchtigen oder nicht?

Betrifft:

  • Erstellung einer neuen Instanz des Objekts und Einstellung alle Werte
    ist in der Zeit getrennt.
  • Aber alle anderen threads, die haben keine Ahnung
    neue Instanz, bis alle Werte eingestellt sind. Also in anderen threads ist nicht
    ein cache der nicht vollständig initialisierte Objekt. Ist es nicht?

Hinweis: ich bin mir bewusst, über das builder pattern, aber ich kann nicht angewendet werden, gibt es mehrere andere Gründe 🙁

BEARBEITET:
Wie ich finde zwei Antworten von Mathias und axtavt passen nicht sehr gut, ich hinzufügen möchte, ein Beispiel:

Sagen wir, wir haben ein foo Klasse:

class Foo {   
    public int x=0;   
}

und zwei threads sind, es zu benutzen, wie oben beschrieben:

 //Thread 1  init the value:   
 Foo f = new Foo();     
 f.x = 5;     
 values.add(f); //Publication via thread-safe collection like Vector or Collections.synchronizedList(new ArrayList(...)) or ConcurrentHashMap?. 

//Thread 2
if (values.size()>0){        
   System.out.println(values.get(0).x); //always 5 ?
}

Als ich Verstand, Mathias, es kann drucken Sie 0 auf einige JVM nach JLS. Wie ich verstanden habe axtavt es wird immer drucken 5.

Was ist Ihre Meinung?

--
Grüße,
Dmitriy

  • Ich kann mich nicht entscheiden, welche Antwort richtig ist. Würde gerne hören, die Meinung der anderen Teilnehmer.
  • Die beiden Antworten miteinander vereinbar sind. axtavt ist keine Vermutung darüber, Wann die threads gestartet werden, damit es beschäftigt sich mit dem Allgemeinen Fall. Mathias ist Adressen, was passiert, wenn du weißt, dass dein Objekt aufgebaut ist und dessen Wert gesetzt werden, bevor der thread gestartet wird (was in der axtavt Worte, könnte gesehen werden als ein Spezialfall der sicheren Veröffentlichung, Dank der Sichtbarkeit der Hindernisse erzwungen durch das starten eines Threads ). Sie ergänzen sich gegenseitig (wenn Ihr threads gestartet werden, bevor die Werte gesetzt sind, werden carreful, wo Sie Ihre volatiles).
InformationsquelleAutor Dime | 2011-07-12
Schreibe einen Kommentar