加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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,当您使用接口时:

>要从头开始实现自己的并发,线程安全的地图
>想包装现有的Java并发映射实现:

例如:

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.
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读