У меня возникла проблема с параллелизмом при обновлении объекта через поле, на которое ссылается 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
Программисты JAVA общаются здесь
-
Anonymous
1713699953
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;
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78361424/java-concurrency-problem-with-enums-and-references[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия