Код: Выделить всё
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>
Обновленные поля (значение и имена) всегда гарантированно видны в основной потоке после join ()? Или я должен использовать AtomicInteger По моему скромному мнению > Метод гарантирует, что все действия, выполняемые выполнением задачи, выполняемых opplibleFuture , выполняются до того, как основной поток продолжится. Это означает, что любые обновления поля или объекты, выполненные выполнением задачи oversablefuture , будут видны в основной поток после возврата join () . Но я не уверен в видимости памяти этих полей. Они могут быть не видны всегда < /strong>. < /P>
Примечание:
Этот пример представляет собой упрощенное отражение более сложного сценария. На практике я понимаю, что я мог бы напрямую установить объект x после завершения завершаемой функции (например, x = future.join ()). Тем не менее, мой фактический вариант использования включает вложенные объекты и общее состояние по нескольким потокам, поэтому я сосредотачиваюсь на видимости поля и безопасности потоков.
Подробнее здесь: https://stackoverflow.com/questions/794 ... in-in-java