Обеспечивает ли завершение Fultfuture видимость обновления поля после join () в Java?JAVA

Программисты JAVA общаются здесь
Anonymous
 Обеспечивает ли завершение Fultfuture видимость обновления поля после join () в Java?

Сообщение Anonymous »

Я работаю с завершением FultableFuture в Java и хочу понять, как обновления поля, сделанные в задаче завершаемой функции, видны в основной потоке после вызова join (). В частности, если я передам объект (x) в задачу завершаемой функции, а задача обновляет поле внутри этого объекта (например, x.y), всегда будет ли основное поток увидеть обновленное значение после join ()?

Код: Выделить всё

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

Подробнее здесь: https://stackoverflow.com/questions/794 ... in-in-java

Вернуться в «JAVA»