我正在寻找快速Map
Long
键的建议。它将具有大量读取访问权限和相当小的写入/更新访问权限。因此,性能应侧重于读取(get
)访问。它必须是线程安全的。一些想法:
collection.Map[Long, _]
必须使用方框键collection.mutable
必须一直包裹synchronized
,惩罚阅读权限collection.immutable
如果存储在@volatile
var
中,则可能具有非同步读取权限。更新可以同步。TMap
?但是Ref[Map[Long, _]]
可能同样好,因为STM中应该允许并发读取对我来说,3号音响最好?
答案 0 :(得分:2)
有一个不可变的LongMap
,2.11将有一个可变的LongMap
。后者不是线程安全的,但你可以包装访问(可能是来自java.util.concurrent
的读写锁,如果你主要是阅读并可以推断可能的死锁)。如果你有很多争论,你不可能比仅使用java.util.concurrent.ConcurrentHashMap
做得更好;线程问题比一些额外的拳击要贵得多。
答案 1 :(得分:2)
collection.Map
默认情况下不是线程安全的,但是必须使用SynchronizedMap
特征,它只是锁定所有访问 - 性能明智不是很大,可能比简单{{1}慢}}
使用不可变映射和在更新时替换的volatile变量将起作用并且将是最便宜的可读选项(不能比简单的易失性读取更便宜)。虽然更新时价格昂贵。
不知道Scala的STM有多好,所以当然也值得一试。
你应该考虑的一个选择是Cliff的非阻塞hashmap,see here。它确实有一个Long版本,所以你可以避免拳击,它的性能难以击败(与java stdlib中的ConcurrentHashMap相比,速度更快,速度更快,这比使用普通的hashmap和锁定更快每次进入)。
答案 2 :(得分:1)
听起来好好使用常规HashMap或fastutil Long2Object map和ReentrantReadWriteLock
。该锁将允许您有多个同时打开的读锁,但写锁必须是独占的。我仍然会针对ConcurrentHashMap
对其进行基准测试,因为它的实现已经非常好了。
卫生署!您可能需要Scala答案,而不是Java风格。