【问题标题】:How to synchronize 2 ConcurrentHashMaps?如何同步2个ConcurrentHashMap?
【发布时间】:2020-03-28 08:25:41
【问题描述】:

我正在尝试编写一个用于买卖物品的媒人。在内部,我使用 2 个HashMaps,1 个用于购买,一个用于每个项目的销售,即如果用户向我发送购买请求,我将其放入我的购买 HashMap,反之亦然。关键是价格,而价值是该价格的订单队列(这样如果价格相同,我可以在 FIFO 的基础上接受请求。一旦我收到请求,例如购买,我就会查看出售 @987654323 @ 表示任何匹配项。用户可以更改他们想要购买的商品的数量或价格,但不能更改商品本身,例如可以更改自行车购买请求的价格或数量,但不能将自行车更改为船)

我想让这个多线程,以便可以同时处理多个请求。所以我将我的hashmaps 设置为ConcurrentHashMaps,并将队列值设置为ConcurrentLinkedQueue。但是,仍然可能存在并发问题,例如我正在查看销售地图以找到与我的购买请求相匹配的匹配项,但在我进行匹配时,销售请求被用户修改为不同的价格。

如何将两个地图与eachother 同步?我想同时锁定两个地图中的同一段(即该价格的队列)。

【问题讨论】:

  • 也许使用一张地图,然后将每个订单标记为买入或卖出?

标签: java multithreading hashmap concurrenthashmap


【解决方案1】:

在您跟踪可用库存的位置添加单个地图,仅在此处进行锁定。

注意:ConcurrentHashMap 也不会锁定单个条目,它会锁定存储桶,因此可能会有更多元素。

【讨论】:

    【解决方案2】:

    我认为对你来说最好的选择是使用ReentrantReadWriteLock。这将有助于读者线程阅读,除非有人正在写入地图。您也可以使用同步块来执行所有操作,但这不会扩展。

    对于ReentrantReadWriteLock doc,请查看https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html

    【讨论】:

    • 但这意味着当任何操作发生时我将锁定两个地图。这不是违背了 ConcurrentHashMap 同时允许 16 个线程的目的吗?我只想在两个映射中锁定我正在使用的键的值并允许访问其他键。
    • 您的问题是,您想跨两个 Map 执行线程安全操作。此外,ReadWrite Lock 只会在写入操作的情况下阻塞。
    猜你喜欢
    • 2010-11-20
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多