Как синхронизировать 2 ConcurrentHashMaps? - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь написать матчмейкера для покупки и продажи предметов. Внутренне я использую 2 HashMaps, 1 для покупок и одну для продаж для каждого предмета, т.е. если пользователь отправляет мне запрос на покупку, я помещаю его в свой HashMap на покупку и наоборот. Ключом является цена, в то время как значение представляет собой очередь заказов по этой цене (так что я могу принимать запросы на основе FIFO, если они имеют одинаковую цену. Как только я получаю запрос, например, на покупку, я просматриваю HashMap на продажу для Любые совпадения. Пользователи могут изменить количество или цену того, что они хотят купить, но они не сами товар, например, могут изменить цену или количество запроса на покупку велосипеда, но не могут изменить велосипед на лодку)

Я хотел бы сделать это многопоточный, так что несколько запросов могут быть обработаны одновременно. Поэтому я сделал свои хеш-карты в ConcurrentHashMaps и в очереди со значением ConcurrentLinkedQueue. Тем не менее, могут возникнуть проблемы с параллелизмом, например, я просматриваю карту продажи, чтобы найти совпадение для моего запроса на покупку, но пока я делаю совпадение, запрос на продажу изменяется пользователем, скажем, по другой цене.

Как я могу синхронизировать две карты друг с другом? Я хотел бы заблокировать один и тот же сегмент (т.е. очередь по этой цене) на обеих картах одновременно.

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Добавьте одну карту, где вы отслеживаете доступный запас, делайте свои замки только там.

Примечание: ConcurrentHashMap также не блокирует одну запись, он блокирует корзину, поэтому может быть больше элементов.

0 голосов
/ 28 марта 2020

Я думаю, что лучшим вариантом для вас является использование ReentrantReadWriteLock. Это поможет читателю читать, если никто не пишет на карту. Вы также можете добиться того же, используя синхронизированный блок для выполнения всех операций, но это не будет масштабироваться.

для ReentrantReadWriteLock do c Пожалуйста, отметьте https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html

...