Параллельный доступ к объекту Java HashMap - PullRequest
0 голосов
/ 20 января 2019

Я создаю приложение Java REST, в котором я использую HashMap для хранения некоторых данных.

Поскольку у него есть сервер, он может обрабатывать несколько запросов одновременно, которые обращаются к HashMap.Все выполненные запросы проверяют, имеет ли карта предопределенное значение (это значение зависит от тела запроса), и если нет, добавьте это значение на карту и верните его.Если карта уже имеет это значение, она просто возвращает значение на карте.

Что я должен принять во внимание, чтобы иметь работающую и надежную систему?У меня будет много операций чтения на карте и некоторых записей (в основном, когда приложение будет запущено, поскольку карта будет пустой).

tl; dr

  • JavaСервер, который будет обрабатывать множественные и одновременные запросы.
  • Каждый запрос будет делать по крайней мере Map.containsKey(someKey) и, в конечном итоге, Map.get(someKey)
  • Некоторые запросы будут делать Map.put(someKey, someValue)

Должен ли я использовать некую параллельную структуру данных?

Ради аргумента я знаю, что использование решения в памяти ненадежно.Это не предназначено для производственного использования, это просто академическое.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Давайте начнем с предположения, что мы используем ConcurrentHashMap, версию HashMap, которая имеет более предсказуемые и интуитивно понятные эффекты согласованности памяти при параллельном доступе.

Учитывая, что самым большим соображением было бы сделать все операции с одним ключом атомарными, если это возможно, или, по крайней мере, непрерывными другим потоком, который хочет выполнить другие операции с этим ключом. Если вы используете Java 8 или новее, использование ConcurrentHashMap метода computeIfAbsent не позволит другим потокам работать, пока новое значение вычисляется и сохраняется.

... Это именно то, что вы хотите, как разработчик приложения: использовать библиотеку, которая была написана, проверена, протестирована и используется экспертами в отношении эффектов параллелизма языка и среды, в которой вы пишете применение.

0 голосов
/ 20 января 2019

Если вы хотите сохранить его в памяти, вам нужно использовать ConcurrentHashMap.

Но что произойдет, если вы перезапустите приложение и потеряете данные памяти?

...