我已经阅读了Java Concurrency in Practice并留下了一个问题:当我使用 ConcurrentHashMap 时,我还需要担心本书第一部分中讨论的哪些数据并发问题?以下是我的一个程序中的几个示例:
1. 交易者的当前头寸(一个共享整数,其中“整数”是数学术语)
这个数字代表了一个trader
对象当前拥有的东西并定义了它的状态。它必须阅读其位置以知道该做什么(寻找开始一个新位置,或管理当前位置)。 Trader
方法在自己的线程上运行。
一个broker
对象负责设置trader
的位置。每次交易者的一个订单被执行时,它将设置头寸。 Broker
方法在自己的线程上运行。
trader
和都broker
在同一个包中。Position 被实现为 package-private static ConcurrentHashMap
。键是交易者对象的 id。值是整数。
包的外部是应用程序。它通过公共吸气剂间接获得交易者的头寸。
位置每隔几分钟最多会更改一次,因此broker
不会经常触摸地图。但是,trader
and 应用程序会经常读取。此外,我们经常有几个交易者同时阅读地图。
因此,以这种方式使用 ConcurrentHashMap,我不必处理锁定和数据可见性?ConcurrentHashMap 处理所有事情?
2. 市场(买、卖、最后价)
与位置几乎相同的情况,除了现在broker
会非常频繁地更新价格(在繁忙时间每秒最多更新 10 次;通常每秒更新几次)。和trader
应用程序仍然会频繁读取。地图键现在是指示哪个股票或期货的代码,而值是保存市场价格的对象。
它似乎工作正常,但在阅读 JCIP 之后,我意识到如果事情没有正确实施,程序仍然可能被破坏。这本书讨论了 ConcurrentHashMap,但没有明确告诉我第一部分中的哪些问题我们不再需要手动解决。在这种情况下,我似乎不需要做synchronize
任何事情。那是对的吗?