2016-12-06 5 views
1

Каковы возможные способы сделать потоки HashSet безопасными? Выделили несколько образцов, как указано ниже.scala thread safe HashSet

var test = new mutable.HashSet[Long] with mutable.SynchronizedSet[Long] 

SynchronizedSet устарел в настоящее время. Любые предложения или образцы будут очень полезны.

+0

Обратите внимание, что [API Docs] (http://www.scala-lang.org/api/current/scala/collection/mutable/SynchronizedSet.html) предлагают то, что вы могли бы использовать вместо устаревшего 'SynchronizedSet'. – Jesper

+0

Они предлагают использовать ConcurrentHashMap, меня интересует Set – Prakash

ответ

5

В документации API scala.collection.mutable.SynchronizedSet предлагается вместо этого использовать java.util.concurrent.ConcurrentHashMap[A, Unit].

Если вы хотите, чтобы это выглядело как Set вместо как Map, то вы можете использовать java.util.Collections.newSetFromMap добавить обертки вокруг Map, чтобы сделать его похожим на Set:

def createSet[T]() = java.util.Collections.newSetFromMap(
    new java.util.concurrent.ConcurrentHashMap[T, java.lang.Boolean]) 

Это, однако , верните 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 
} 

Теперь вы можете создать синхронизированный набор с элементами определенного типа, например Long, как это:

val set = createSet[Long]