Code: Select all
class Y {
private int value;
private List names;
public Y() {
this.names = new ArrayList();
}
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void addName(String name) {
this.names.add(name);
}
public List getNames() {
return names;
}
}
class X {
private Y y;
public void setY(Y y) {
this.y = y;
}
public Y getY() {
return y;
}
}
public class Main {
public static void main(String[] args) {
X x = new X();
CompletableFuture future = CompletableFuture.runAsync(() -> {
Y newY = new Y();
newY.setValue(42);
newY.addName("Alice");
newY.addName("Bob");
x.setY(newY); // Update the y field of x
});
future.join(); // Wait for the CompletableFuture to complete
// Will the main thread always see the updated y field?
System.out.println("Value: " + x.getY().getValue()); // Should print 42
System.out.println("Names: " + x.getY().getNames()); // Should print [Alice, Bob]
}
}
< /code>
Sind die aktualisierten Felder (Wert und Namen) von x.y nach dem Join () immer garantiert für den Haupt -Thread sichtbar? Oder ich muss Atomicinteger
In meiner bescheidenen Meinung > Methode stellt sicher, dass alle Aktionen, die von der Aufgabe von CompleteableFuture ausgeführt werden, vor dem Fortschritt des Haupt -Threads ausgeführt werden. Dies bedeutet, dass Updates für Felder oder Objekte, die von der Aufgabe von CompleteableFuture erstellt wurden, nach dem Haupt -Thread nach join () zurückgegeben werden. Aber ich bin mir nicht sicher, ob diese Felder die Sichtbarkeit des Speichers sind. Sie sind möglicherweise nicht sichtbar immer < /strong>. In der Praxis verstehe ich, dass ich das X -Objekt nach Abschluss des Vervollständigungsfuture direkt festlegen könnte (z. B. x = Future.join ()). Mein tatsächlicher Anwendungsfall betrifft jedoch verschachtelte Objekte und gemeinsamer Zustand über mehrere Threads hinweg. Deshalb konzentriere ich mich auf die Sichtbarkeit von Feld und die Gewindesicherheit.