Scala - 可变线程安全集合

问题描述 投票:0回答:3

我需要 Scala 中的可变线程安全映射和可变线程安全列表。我知道不可变集合默认是线程安全的。但是,我需要经常更新我的集合,因此我无法使用不可变。我还需要线程安全的可变 Map 来维护插入顺序。

现在正在使用下面的地图

val map = scala.collection.mutable.LinkedHashMap[String,Any]()

该映射保持插入顺序并且是可变的。如何使其线程安全?

multithreading scala collections dictionary thread-safety
3个回答
46
投票

对于 2018 年或以后接触此内容的人的快速提示:

import java.util.concurrent.ConcurrentHashMap

val m: ConcurrentHashMap[String,MyClass] = new ConcurrentHashMap

22
投票

正如 AlexIv 在他的回答中提到的那样,如果你想要线程安全,你可以混合使用一个特性。不过还有另一种方法:

val synchronizedMap = new scala.collection.mutable.LinkedHashMap[String, Any]() with scala.collection.mutable.SynchronizedMap[String, Any]
这应该为您提供

每次访问时同步的地图。简单,但可能无法满足性能要求。如果是这样,创建一个扩展 LinkedHashMap

 的自定义类,混合 
concurrent.Map
 特征(如建议的那样)
并提供相关方法的实现可能会更容易,即:
putIfAbsent
remove
 
replace
(2 个重载)。


0
投票
要详细说明

Map

 的评论,您可以使用

import scala.collection.concurrent.TrieMap
未弃用,并且是可变且线程安全的。

它应该适合您的

scala.collection.mutable.LinkedHashMap

,因为它们共享 
scala.collection.mutable.MapLike
scala.collection.mutable.Map
 相同的界面

可悲的是我不知道

List


    

© www.soinside.com 2019 - 2024. All rights reserved.