快速线程安全读取优化Map [Long,_]

时间:2014-02-25 21:50:58

标签: multithreading scala collections

我正在寻找快速Map Long键的建议。它将具有大量读取访问权限和相当小的写入/更新访问权限。因此,性能应侧重于读取(get)访问。它必须是线程安全的。一些想法:

  1. 常规collection.Map[Long, _]必须使用方框键
  2. 裸骨collection.mutable必须一直包裹synchronized,惩罚阅读权限
  3. 裸骨collection.immutable如果存储在@volatile var中,则可能具有非同步读取权限。更新可以同步。
  4. 来自Scala-STM的
  5. 或许TMap?但是Ref[Map[Long, _]]可能同样好,因为STM中应该允许并发读取
  6. 对我来说,3号音响最好?

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 mapReentrantReadWriteLock。该锁将允许您有多个同时打开的读锁,但写锁必须是独占的。我仍然会针对ConcurrentHashMap对其进行基准测试,因为它的实现已经非常好了。

卫生署!您可能需要Scala答案,而不是Java风格。