Scala - Mutable线程安全集合

yAs*_*AsH 19 collections multithreading scala map thread-safety

我需要一个可变线程安全Map和Scala中的一个可变线程安全List.我知道默认情况下不可变集合是线程安全的.但是,我需要经常更新我的集合,因为我不能使用不可变的.此外,我需要我的线程安全可变Map来维护插入顺序.

现在我正在使用下面的地图

val map = scala.collection.mutable.LinkedHashMap[String,Any]()
Run Code Online (Sandbox Code Playgroud)

此映射维护插入顺序并且是可变的.如何使其线程安全?

Pat*_*iek 19

  1. 你正在重复主题....
  2. 正如AlexIv在他的回答中所提到的,如果你想要线程安全,你可以混合使用一个特性.还有另一种方式:

    val synchronizedMap = new scala.collection.mutable.LinkedHashMap[String, Any]() with scala.collection.mutable.SynchronizedMap[String, Any]
    
    Run Code Online (Sandbox Code Playgroud)

这应该为您提供每次访问同步地图.容易,但可能不符合性能要求.如果是这样,创建一个自定义类可能更容易扩展LinkedHashMap,混合concurrent.Map特征(如建议的那样)并提供相关方法的实现,即:putIfAbsent,remove replace(2个重载).

  • 如果你可以做更多的工作,直接在可变集合上使用`synchronized`方法,你需要线程安全.它可以为你节省这个mixin带来的性能损失.例如`someMap.synchronized {someMap + =("someKey","anyValue")}` (21认同)
  • 对于任何新观看的人来说,已经弃用了SynchronizedMap特征,因为它不够安全.建议使用Java线程安全集合. (8认同)
  • @Gepp:http://www.scala-lang.org/api/2.12.3/scala/collection/mutable/SynchronizedMap.html:"(从版本2.11.0开始)不推荐使用traits同步,因为它本身就不可靠.考虑`java.util.concurrent.ConcurrentHashMap`作为替代." (2认同)
  • TrieMap 是可变的、线程安全的、无锁的,并且未被弃用 (2认同)

aka*_*ppi 18

快速提示2018年或之后的人们:

import java.util.concurrent.ConcurrentHashMap

val m: ConcurrentHashMap[String,MyClass] = new ConcurrentHashMap
Run Code Online (Sandbox Code Playgroud)

  • 2021年还有效吗? (3认同)
  • 是的,它是有效的。自 Scala 2.11.0 起,Scala 中的“同步”集合已被弃用。建议使用“java.util.concurrent.”包。 (2认同)