在Scala concurrent.Map中混合的最佳做法
发布时间:2020-12-16 09:43:00 所属栏目:安全 来源:网络整理
导读:ScalaDoc表示关于concurrentMap:“不推荐使用(自版本2.10.0起)使用scala.collection.concurrent.Map代替。不幸的是, rest of the Scala docs尚未更新,仍然引用concurrentMap。 我试图将concurrent.Map混合到一个HashMap中,具有以下结果: scala val mmap
ScalaDoc表示关于concurrentMap:“不推荐使用(自版本2.10.0起)使用scala.collection.concurrent.Map代替。不幸的是,
rest of the Scala docs尚未更新,仍然引用concurrentMap。
我试图将concurrent.Map混合到一个HashMap中,具有以下结果: scala> val mmap = new mutable.HashMap[String,String] with collection.concurrent.Map[String,String] <console>:16: error: object creation impossible,since: it has 4 unimplemented members. /** As seen from anonymous class $anon,the missing signatures are as follows. * For convenience,these are usable as stub implementations. */ def putIfAbsent(k: String,v: String): Option[String] = ??? def remove(k: String,v: String): Boolean = ??? def replace(k: String,v: String): Option[String] = ??? def replace(k: String,oldvalue: String,newvalue: String): Boolean = ??? val mmap = new mutable.HashMap[String,String] 所以我们看到,而不是一个简单的混合,一些方法也必须实现。这是使用concurrent.Map的最佳方法,还是有更好的方法? 解决方法
scala.collection.concurrent.Map trait并不意味着与现有的可变的Scala Map混合,以获取线程安全版本的地图实例。在2.11之前,SynchronizedMap mixin存在于此目的,但现在已被弃用。
目前,Scala具有scala.collection.concurrent.Map接口的scala.collection.concurrent.TrieMap实现,但也可以包装Java类。 scala.collection.concurrent.Map,在2.10之前的版本称为scala.collection.mutable.ConcurrentMap,当您使用接口时: >要从头开始实现自己的并发,线程安全的地图 例如: import scala.collection._ import scala.collection.convert.decorateAsScala._ import java.util.concurrent.ConcurrentHashMap val map: concurrent.Map[String,String] = new ConcurrentHashMap().asScala >想要编写工作并发映射的通用代码,而不想提交到一个特定的实现: 例如。: import scala.collection._ def foo(map: concurrent.Map[String,String]) = map.putIfAbsent("","") foo(new concurrent.TrieMap) foo(new java.util.concurrent.ConcurrentSkipListMap().asScala) >您可以通过使用synchronized来实现单线程可变地图实现的自己的包装(但是您需要确保您的程序仅通过此包装器访问可变地图,并且从不直接)。 例如。: class MySynchronizedMap[K,V](private val underlying: mutable.Map[K,V]) extends concurrent.Map[K,V] { private val monitor = new AnyRef def putIfAbsent(k: K,v: V): Option[String] = monitor.synchronized { underlying.get(k) match { case s: Some[V] => s case None => underlying(k) = v None } } def remove(k: K,v: V): Boolean = monitor.synchronized { underlying.get(k) match { case Some(v0) if v == v0 => underlying.remove(k); true case None => false } } // etc. } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |