scala线程安全HashSet

Pra*_*ash 3 scala

使HashSet线程安全的可能方法是什么?看到下面给出的一些样品.

var test = new mutable.HashSet[Long] with mutable.SynchronizedSet[Long]
Run Code Online (Sandbox Code Playgroud)

目前不推荐使用SynchronizedSet.任何建议或样品都会非常有帮助.

Jes*_*per 15

作为scala.collection.mutable.SynchronizedSet建议的API文档,您可以使用java.util.concurrent.ConcurrentHashMap[A, Unit].

如果你希望它看起来像一个Set而不是像a Map,那么你可以使用java.util.Collections.newSetFromMapMap它周围添加一个包装使它看起来像Set:

def createSet[T]() = java.util.Collections.newSetFromMap(
  new java.util.concurrent.ConcurrentHashMap[T, java.lang.Boolean])
Run Code Online (Sandbox Code Playgroud)

但是,这将返回Java Set.您可以将其包装为scala.collection.mutable.Set:

def createSet[T]() = {
  import scala.collection.JavaConverters._
  java.util.Collections.newSetFromMap(
    new java.util.concurrent.ConcurrentHashMap[T, java.lang.Boolean]).asScala
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用特定类型的元素创建同步集,例如Long,如下所示:

val set = createSet[Long]
Run Code Online (Sandbox Code Playgroud)

  • 此外,您可以通过这种方式创建它:`java.util.concurrent.ConcurrentHashMap.newKeySet[Int]().asScala`。简洁一点。 (2认同)