在Scala中我需要一个可变的线程安全Map和一个可变的线程安全List。我知道不可变的集合在默认情况下是线程安全的。但是,我需要经常更新我的集合,因此我不能使用不可变的。我还需要我的线程安全的可变Map来维护插入顺序。现在我使用下面的Map
val map = scala.collection.mutable.LinkedHashMap[String,Any]()
这个Map保持了插入顺序并且是可变的。我如何使它成为线程安全的?
eeq64g8w1#
对于那些在2018年或以后来到这里的人的快速提示:
import java.util.concurrent.ConcurrentHashMap val m: ConcurrentHashMap[String,MyClass] = new ConcurrentHashMap
ryhaxcpt2#
val synchronizedMap = new scala.collection.mutable.LinkedHashMap[String, Any]() with scala.collection.mutable.SynchronizedMap[String, Any]
这样就可以在每次访问时提供同步Map。很简单,但可能无法满足性能要求。如果是这样,创建一个扩展LinkedHashMap的自定义类,混合concurrent.Map特征(如建议的那样)并提供相关方法的实现可能会更容易,例如:putIfAbsent、remove和replace(2次过载)。
LinkedHashMap
concurrent.Map
putIfAbsent
remove
replace
2skhul333#
要详细说明Map的注解,可以使用
Map
import scala.collection.concurrent.TrieMap
未被弃用,并且是可变的和线程安全的。您的scala.collection.mutable.LinkedHashMap应该会遇到这种情况,因为它们共享相同的scala.collection.mutable.MapLike和scala.collection.mutable.Map接口遗憾的是,我不了解List
scala.collection.mutable.LinkedHashMap
scala.collection.mutable.MapLike
scala.collection.mutable.Map
List
3条答案
按热度按时间eeq64g8w1#
对于那些在2018年或以后来到这里的人的快速提示:
ryhaxcpt2#
1.正如AlexIv in his answer所提到的,如果你想要线程安全,你可以混合一种特性,不过还有另一种方法:
这样就可以在每次访问时提供同步Map。很简单,但可能无法满足性能要求。如果是这样,创建一个扩展
LinkedHashMap
的自定义类,混合concurrent.Map
特征(如建议的那样)并提供相关方法的实现可能会更容易,例如:putIfAbsent
、remove
和replace
(2次过载)。2skhul333#
要详细说明
Map
的注解,可以使用未被弃用,并且是可变的和线程安全的。
您的
scala.collection.mutable.LinkedHashMap
应该会遇到这种情况,因为它们共享相同的scala.collection.mutable.MapLike
和scala.collection.mutable.Map
接口遗憾的是,我不了解
List