【发布时间】:2009-09-08 16:44:02
【问题描述】:
我希望能够有条件地替换 ConcurrentHashMap 中的值。也就是说,给定:
公共类 PriceTick { 最终字符串工具ID; ... 最终长时间戳; ...还有一个类(我们称之为 TickHolder),它拥有一个 ConcurrentHashMap(我们称之为 map)。
我希望能够实现一个有条件的 put 方法,这样如果键没有条目,则插入新的条目,但如果存在现有条目,则插入新的条目仅当新 PriceTick 中的时间戳值大于现有的值。
对于老式的 HashMap 解决方案,TickHolder 会有一个 put 方法:
公共无效添加(PriceTick 刻度){ 同步(地图){ 如果 ((map.get(tick.instrumentId) == null) || (tick.getTimestamp() > map.get(tick.instrumentId).getTimestamp()) map.put(tick.instrumentId,tick); } }对于 ConcurrentHashMap,人们会想要放弃同步并使用一些原子方法,如替换,但这是无条件的。所以很明显必须写“条件替换”方法。
然而,由于 test-and-replace 操作是非原子的,为了线程安全,它必须是同步的 - 但我最初阅读 ConcurrentHashMap 源代码让我认为外部同步和它们的内部同步锁不会很好地工作,所以至少,每个执行结构更改和包含类执行的 Map 方法都必须由包含类同步......即使那样,我也会相当不安。
我考虑过继承 ConcurrentHashMap,但这似乎是不可能的。它使用了一个具有默认访问权限的内部 final 类 HashEntry,因此虽然 ConcurrentHashMap 不是 final,但它是不可扩展的。
这似乎意味着我必须回退到将 TickHolder 实现为包含一个老式 HashMap 才能编写我的条件替换方法。
那么,问题是:我对上述内容是否正确?我是否(希望)遗漏了一些东西,无论是明显的还是微妙的,都会导致不同的结论?我真的很想在这里使用那个可爱的条纹锁定机制。
【问题讨论】:
标签: java multithreading collections