У меня возникла проблема с параллелизмом при обновлении объекта через поле, на которое ссылается 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
Проблема параллелизма Java с перечислениями и ссылками ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Формальное+дидактическое+схематическое объяснение параллелизма и параллелизма.
Anonymous » » в форуме C++ - 0 Ответы
- 39 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Спецификация Openapi для точек REST Java с перечислениями всегда в верхнем регистре
Anonymous » » в форуме JAVA - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-