我有一个特定的用例,但无法确定要使用的正确数据结构.
我有一个线程可以将对象保存到HashMap中.类似于市场数据的东西,你有很高和未知的滴答频率.
另一个线程不断按顺序读取此映射以更新Price对象和查询.对于给定周期中的相同密钥,查询可以是多次.读取和写入非常频繁,但读取线程仅对最新可用数据感兴趣,这些数据已完全更新,并且在写入完成之前不一定会阻塞.
我希望您对这种用例的理想数据结构有所了解.是否有比ConcurrentHashMap更好的实现?
谢谢
最佳答案
一种方法是写入时复制方案,如下所示:
public class Prices {
private volatile Map
这对于获取具有最小的开销 – 从易失性读取,然后是正常的散列查找.但是,它对于put来说有很大的开销 – 创建一个全新的map,以及写一个volatile.如果您的读写比率很高,这可能仍然是一个很好的权衡.
您只需在实际需要添加新条目时更改地图,而不是更新现有条目,就可以改善这一点.你可以通过使用可变值来实现这一点:
public class Prices {
private volatile Map
我不确定AtomicInteger的性能特征是什么;它可能比看起来慢.假设AtomicInteger不是非常慢,这应该是非常快的 – 它涉及来自volatile的两次读取以及每次get的正常散列查找,以及来自volatile的读取,散列查找以及对volatile的单次写入以进行更新现有价格.它仍然涉及复制地图以增加新价格.但是,在典型的市场中,这种情况并不常发生.