ConcurrentHashMap обновление нескольких записей - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть ситуация, когда в ConcurrentHashMap я сохраняю некоторые свойства, такие как IP-адрес и порт или штраф и код - 2 или более записей, которые связаны друг с другом.

Теперь я хочу обновить эти 2 записи атомарно, чтобы избежать чтения неправильных пар.

Так что теперь я думаю об этом и не знаю простого решения.

Я мог бы обернуть методы get / put с помощью блоков ReadWriteLock, но это неправильно :) Я не использую ConcurrentHashMap для записи дополнительных блокировок.

Другой вариант - объединить эти свойства в одно.Прямо сейчас я склоняюсь к этому варианту.

Другой вариант - иметь версию в значении объекта, но тогда мне нужно каждый раз проверять ее, и я не хочу это делать:)

Есть ли какое-то другое решение этой проблемы?

С уважением

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы не можете атомарно обновить несколько записей.У вас есть два варианта:

  • Использовать простой HashMap с внешней синхронизацией.

  • Используйте другой тип для значений Map, который включает пару элементов, которые должны рассматриваться вместе.

0 голосов
/ 05 декабря 2018

Я думаю, вы можете использовать другой способ, без ConcurrentHashMap.

Если вы хотите добавить что-то вроде приоритета ваших операций.Например: операции обновления выше, чем операции get. Вы можете использовать PriorityBlockingQueue и, например, :HashSet для хранения объектов без повторений.Тогда Вы уверены, что Ваши актуальные свойства самые новые.

...