gpt4 book ai didi

java - ConcurrentHashMap 条件替换

转载 作者:搜寻专家 更新时间:2023-11-01 01:58:51 27 4
gpt4 key购买 nike

我希望能够有条件地替换 ConcurrentHashMap 中的值。也就是说,给定:

public class PriceTick {   final String instrumentId;   ...   final long timestamp;   ...

还有一个类(我们称它为 TickHolder),它拥有一个 ConcurrentHashMap(我们称它为 map)。

我希望能够实现一个有条件的 put 方法,这样如果键没有条目,则插入新条目,但如果存在现有条目,则插入新条目只有当新 PriceTick 中的时间戳值大于现有的

对于老式的 HashMap 解决方案,TickHolder 会有一个 put 方法:

public void add(PriceTick tick) {   synchronized(map) {      if ((map.get(tick.instrumentId) == null)         || (tick.getTimestamp() > map.get(tick.instrumentId).getTimestamp()) )         map.put(tick.instrumentId, tick);      }}

对于 ConcurrentHashMap,人们可能希望放弃同步并使用一些原子方法(如替换),但这是无条件的。很明显,必须编写“条件替换”方法。

然而,由于测试和替换操作是非原子的,为了线程安全,它必须是同步的——但我最初阅读 ConcurrentHashMap 源代码让我认为外部同步及其内部同步锁不会很好地工作,所以至少,每个执行结构更改和包含类执行的 Map 方法都必须由包含类同步......即使那样,我也会相当不安。

我考虑过对 ConcurrentHashMap 进行子类化,但这似乎是不可能的。它使用具有默认访问权限的内部最终类 HashEntry,因此尽管 ConcurrentHashMap 不是最终类,但它不可扩展。

这似乎意味着我必须回退到将 TickHolder 实现为包含老式 HashMap 才能编写我的条件替换方法。

那么,问题来了:我对以上的看法是否正确?我是否(希望)错过了一些会导致不同结论的东西,无论是明显的还是微妙的?我真的很想在这里使用那个可爱的条纹锁定机制。

最佳答案

非确定性解决方案是循环replace() :

do {
PriceTick oldTick = map.get(newTick.getInstrumentId());
} while ((oldTick == null || oldTick.before(newTick)) && !map.replace(newTick.getInstrumentId(), oldTick, newTick);

虽然看起来很奇怪,但这是针对此类事情的常见建议模式。

关于java - ConcurrentHashMap 条件替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1395010/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com