Проблема параллелизма 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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Формальное+дидактическое+схематическое объяснение параллелизма и параллелизма.
    Anonymous » » в форуме C++
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • Спецификация Openapi для точек REST Java с перечислениями всегда в верхнем регистре
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Оператор Switch без значения по умолчанию при работе с перечислениями
    Гость » » в форуме C#
    0 Ответы
    25 Просмотры
    Последнее сообщение Гость
  • C++26 Отражение и циклы над перечислениями
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Наиболее распространенные побитовые операции C# над перечислениями
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

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