gpt4 book ai didi

java - 使用 ConcurrentHashMap 消除了数据可见性问题?

转载 作者:行者123 更新时间:2023-12-05 00:43:20 26 4
gpt4 key购买 nike

我已通读 Java Concurrency in Practice剩下一个问题:当我使用 ConcurrentHashMap 时,我还需要担心本书第一部分中讨论的哪些数据并发问题?以下是我的一个程序中的几个示例:

1.交易者当前持仓 (一个共享整数,其中“整数”是数学术语)

这个数字代表 trader对象当前拥有并定义其状态。它必须阅读其位置以知道该做什么(寻找开始一个新位置,或管理当前位置)。 Trader方法在自己的线程上运行。

一个 broker对象负责设置trader的立场。每次交易者的一个订单被执行时,它将设置头寸。 Broker方法在自己的线程上运行。
traderbroker在同一个包中。位置实现为包私有(private) static ConcurrentHashMap .键是交易者对象的 id。值是整数。

包的外部是应用程序。它通过公共(public) setter/getter 间接获得交易者的头寸。

位置最多每隔几分钟就会改变一次,所以 broker不会经常碰 map 。但是,trader并且应用程序会经常阅读。此外,我们经常有几个交易者同时阅读 map 。

因此,以这种方式使用 ConcurrentHashMap,我不必处理锁定和数据可见性? ConcurrentHashMap 处理所有事情?

2. 市场(买、卖、最后价)

与位置几乎相同的情况,除了现在 broker会非常频繁地更新价格(在繁忙时间每秒最多更新 10 次;通常每秒更新几次)。 trader并且应用程序仍然经常读取。 map 键现在是指示哪个股票或 future 的代码,而值是保存市场价格的对象。

它似乎工作正常,但在阅读 JCIP 之后,我意识到如果事情没有正确实现,程序仍然可能被破坏。这本书讨论了 ConcurrentHashMap,但没有明确告诉我第一部分中的哪些问题我们不再需要手动解决。看来我不必synchronize在这种情况下任何事情。那是对的吗?

最佳答案

So using a ConcurrentHashMap this way, I don't have to work about locking and data visibility? The ConcurrentHashMap takes care of everything?



这取决于 map 中的内容,如果我正确阅读了您的示例,情况如下所示
static final ConcurrentMap<Integer,Integer> map = ...

class Trader{

public int doRead(){
map.get(someId);
}
}
class Broker{
public void doWrite(){
map.put(someId,someValue);
}
}

如果是这种情况,那么是的,所有的并发都得到了处理。

但是,如果 map 看起来像
static final ConcurrentMap<Integer,Trader> map = ..

class Broker{
public void doWrite(){
map.get(someId).setPosition(somePosition);
}
}

这不是线程安全的,即使您放置时 ConcurrentHashMap 锁定,此时对象的所有并发访问都必须处理它们自己的同步。

关于java - 使用 ConcurrentHashMap 消除了数据可见性问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4556593/

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