Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 快速线程安全读取优化映射[Long,u]_Multithreading_Scala_Collections - Fatal编程技术网

Multithreading 快速线程安全读取优化映射[Long,u]

Multithreading 快速线程安全读取优化映射[Long,u],multithreading,scala,collections,Multithreading,Scala,Collections,我正在寻找使用Long键的快速Map的建议。它将有大量的读访问和相当小的写/更新访问。因此,性能应侧重于读取(get)访问。它必须是线程安全的。一些想法: 常规的collection.Map[Long,quot]必须设置框键 基本的集合。可变的必须始终包装同步的,这将惩罚读取访问 裸骨骼集合。如果存储在@volatilevar中,则不可变的可能具有不同步的读取访问。更新无法同步 可能是Scala STM的TMap?但是一个Ref[Map[Long,]]可能同样好,因为STM中应该允许并发读取 对

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

  • 常规的
    collection.Map[Long,quot]
    必须设置框键
  • 基本的
    集合。可变的
    必须始终包装
    同步的
    ,这将惩罚读取访问
  • 裸骨骼
    集合。如果存储在
    @volatile
    var
    中,则不可变的
    可能具有不同步的读取访问。更新无法同步
  • 可能是Scala STM的
    TMap
    ?但是一个
    Ref[Map[Long,]]
    可能同样好,因为STM中应该允许并发读取

  • 对我来说,3号听起来最好?

    有一个不可变的
    LongMap
    ,2.11将有一个可变的
    LongMap
    。后者不是线程安全的,但您可以包装访问(如果您主要是在读取,并且可以通过可能的死锁进行推理,则可能使用
    java.util.concurrent
    中的读写锁)。如果您有很多争用,那么您不可能比只使用
    java.util.concurrent.ConcurrentHashMap做得更好;线程问题比额外的装箱要昂贵得多。

    有一个不可变的
    LongMap
    ,2.11将有一个可变的
    LongMap
    。后者不是线程安全的,但您可以包装访问(如果您主要是在读取,并且可以通过可能的死锁进行推理,则可能使用
    java.util.concurrent
    中的读写锁)。如果您有很多争用,那么您不可能比只使用
    java.util.concurrent.ConcurrentHashMap做得更好;线程问题比额外的装箱要昂贵得多。

    听起来像是对常规HashMap或fastutil和
    ReentrantReadWriteLock的很好的使用。该锁允许同时打开多个读锁,但写锁必须是独占的。我仍然会将它与
    ConcurrentHashMap
    进行基准测试,因为众所周知它的实现非常好


    啊!您可能想要的是Scala答案,而不是Java风格。

    听起来像是常规HashMap或fastutil和
    ReentrantReadWriteLock的很好使用。该锁允许同时打开多个读锁,但写锁必须是独占的。我仍然会将它与
    ConcurrentHashMap
    进行基准测试,因为众所周知它的实现非常好


    啊!您可能想要的是Scala答案,而不是Java风格。

    collection.Map
    在默认情况下不是线程安全的,但必须使用
    SynchronizedMap
    特性,它只是锁定了所有访问—从性能上看不是很好,可能比简单的
    ConcurrentHashMap

    使用一个不可变映射和一个在更新时被替换的易失性变量将起作用,并且将是最便宜的可能的读取方式(不能比简单的易失性读取便宜)。但更新时会很昂贵

    不知道Scala的STM有多好,所以当然也值得一试


    一个你绝对应该考虑的选项,那就是克里夫的无阻塞哈希图。它确实有一个很长的版本,因此您可以避免装箱,而且在性能方面很难击败它(取决于情况,与java stdlib中的ConcurrentHashMap相比,它的速度要快得多,而ConcurrentHashMap也比仅使用普通hashmap和锁定每个访问要快得多).Map在默认情况下不是线程安全的,但是必须使用

    SynchronizedMap
    特性,它只是锁定了所有的访问—从性能上看不是很好,可能比简单的
    ConcurrentHashMap

    使用一个不可变映射和一个在更新时被替换的易失性变量将起作用,并且将是最便宜的可能的读取方式(不能比简单的易失性读取便宜)。但更新时会很昂贵

    不知道Scala的STM有多好,所以当然也值得一试


    一个你绝对应该考虑的选项,那就是克里夫的无阻塞哈希图。它确实有一个很长的版本,因此您可以避免装箱,而且在性能方面很难击败它(取决于情况,与java stdlib中的ConcurrentHashMap相比,它的速度要快得多,而ConcurrentHashMap也比仅使用普通hashmap和锁定每个访问要快得多).

    我认为volatile会影响集合本身,而不是它的内容。我认为volatile会影响集合本身,而不是它的内容。
    注释:从2.8开始,这个类基本上被HashMap取代。
    LongMap
    上?确切地说,我看到了关于过时的注释。另外,由于它位于常规的scala.collection类型层次结构中,我认为它仍然会对键进行装箱,对吗?@0_uuuu-我不太熟悉
    immutable.LongMap
    ,但它不应该装箱键,除非您在通用上下文中使用(在这种情况下,它会对键进行装箱和取消装箱)。诚然,
    不可变的.LongMap
    并没有得到太多的研究。但是可变的是全新的。
    注意:这个类从2.8开始基本上被HashMap取代。
    LongMap
    上的
    ?确切地说,我看到了关于过时的注意。另外,由于它位于常规的scala.collection类型层次结构中,我认为它仍然会对键进行装箱,对吗?@0_uuuu-我不太熟悉
    immutable.LongMap
    ,但它不应该装箱键,除非您在通用上下文中使用(在这种情况下,它会对键进行装箱和取消装箱)。诚然,
    不可变的.LongMap
    并没有得到太多的研究。但是可变的是全新的。感谢您提到
    java.util.concurrent.ConcurrentHash