Многопоточность и параллелизм — как хорошо спроектировать приложение для отдыха с использованием одноэлементных компонентов?

У меня есть @RestController("tables") со следующей зависимостью:

private Map<String, Table> tables;

Поле tables было объявлено в СпрингКонфиг как синглтонфасоль и содержит информацию обо всех таблицах.
Перед обновлением какой-либо таблицы следует проверить, существует ли она, и только в этом случае обращаться к базе данных.
После создания вы должны добавить таблицу в таблицы и т.д.

Контроллер может выполнять операции CRUD с таблицами.

Как обеспечить корректную работу с разделением ресурсов?
Насколько я знаю, я могу использовать ConcurrentHashMap вместо обычного HashMap. В этом случае он будет хорошо работать с добавлением и вводом, но когда необходимо обновить значение (его поля), у меня будут проблемы.

И если у меня есть зависимость, например, какой-то privateTable table - singleton bean, должен ли я использовать блок synchronized или что-то еще?

Если можно, дайте мне несколько примеров, чтобы понять, как это работает.
Основная идея — понять, как предотвратить появление некорректных данных, когда разные потоки имеют доступ к одному и тому же ресурсу.

Вы можете определить записи как неизменяемые данные и просто заменить всю запись в ConcurrentHashMap при обновлении. В противном случае вам необходимо убедиться, что каждая из записей является потокобезопасной.

flakes 19.02.2019 04:31

Как поля хранятся на карте? Это JSON, список через запятую или ArrayList? Если это не структура данных List, разве вы не можете использовать CopyOnWriteArrayList? Судя по характеру проблемы, это не похоже на очень загруженный процесс. Если это так, разве вы не можете просто использовать любой простой кодовый замок, например synchronized? Если нет, пожалуйста, уточните проблему с этими деталями и своим пониманием того, почему это невозможно сделать?

Saptarshi Basu 19.02.2019 07:35

@flakes, и если у меня есть ситуация, когда мои записи не могут быть неизменными, как я могу обновить их на карте?

Donatello 19.02.2019 12:25

Карта @SaptarshiBasu содержит key-String и value-bean (pojo), созданные из json

Donatello 19.02.2019 12:27

@SaptarshiBasu Я могу использовать любые возможности, включая синхронизацию, но у меня нет практики работы с многопоточностью, и я ищу совета, чтобы убедиться, что я правильно понимаю, как решить эту проблему. Как работать с картой, как обновить значение карты (и сохранить предыдущее значение, изменив только некоторые поля), и как работать с java bean-компонентами. Я думаю, что с bean-компонентами я могу просто использовать синхронизированные внутри методы контроллера, когда у нас есть доступ к этому bean-компоненту, это правильно?

Donatello 19.02.2019 12:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
47
0

Другие вопросы по теме