Проблема параллелизма Java с перечислениями и ссылкамиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблема параллелизма Java с перечислениями и ссылками

Сообщение Anonymous »

У меня возникла проблема с параллелизмом при обновлении объекта через поле, на которое ссылается Enum.
Код здесь, на jdoodle и Github.
После установки поля объекта с помощью метода Car#start через UpdatePolicy я вижу, что оно обновлено до неправильного значения. Однако напрямую использовать Car#start вполне можно.
Кроме того, если я удалю перечисление (с именем State), проблема исчезнет. Я думаю, что переменные уровня поля Enum почему-то не являются потокобезопасными.
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

public class Scratch {
public static void main(String[] args) {
for (int x = 0; x < 100; x++) {
List futures = new ArrayList();
for (int i = 0; i < 100; i++) {
int finalI = i;
futures.add(CompletableFuture.runAsync(() -> startCar(String.valueOf(finalI))));
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
}
}

private static void startCar(String index) {
var car = new Car();
car.getUpdatePolicy().start(index);
if (!index.equals(car.getJourneyId())) {
throw new RuntimeException("Expected journeyId to be " + index + " but was " + car.getJourneyId());
}
}

static class Car {

private State state = State.OFF;
private String journeyId;

public UpdatePolicy getUpdatePolicy() {
return state.getJobUpdatePolicy(this);
}

public void start(String journeyId) {
this.journeyId = journeyId;
}

public String getJourneyId() {
return journeyId;
}
}

enum State {
OFF(new UpdatePolicy() {
@Override
public void start(String journeyId) {
car.start(journeyId);
}
});

private final UpdatePolicy updatePolicy;

State(UpdatePolicy updatePolicy) {
this.updatePolicy = updatePolicy;
}

public UpdatePolicy getJobUpdatePolicy(Car car) {
return updatePolicy.withContext(car);
}
}

abstract static class UpdatePolicy {

Car car;

public abstract void start(String journeyId);

public UpdatePolicy withContext(Car car) {
this.car = car;
return this;
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/783 ... references
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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