2013-07-09 55 views
13

我需要一個可變的線程安全Map和一個可變的線程安全List在Scala中。我知道不可變集合默認是線程安全的。但是,我需要經常更新我的集合,因爲我無法使用不可變的。此外,我需要我的線程安全可變Map來維護插入順序。Scala - 可變線程安全集合

現在我用下面

val map = scala.collection.mutable.LinkedHashMap[String,Any]() 

地圖這張地圖保持插入順序,是可變的。我如何使它線程安全?

+0

[線程安全地圖其保留了插入順序(http://stackoverflow.com/questions/17540467/thread-safe-map-which-preserves-the-insertion-order)的可能重複 – 4lex1v

+0

@AlexIv不是完全意義上的副本 - rahul問太多列表 –

+0

@ om-nom-nom無論如何它可以被修改,但創建一個新的問題是多餘的 – 4lex1v

回答

15
  1. You're duplicating topics....
  2. 正如由AlexIv in his answer提到,有一個特點,如果你想線程安全的,你可以混合英寸還有,雖然另一種方式:

    val synchronizedMap = new scala.collection.mutable.LinkedHashMap[String, Any]() with scala.collection.mutable.SynchronizedMap[String, Any] 
    

這應該給你的map with synchronization on each access。很簡單,但可能不符合性能要求。如果是這樣,創建一個擴展LinkedHashMap的自定義類可能更容易,在concurrent.Map trait (as was suggested)中混合並提供相關方法的實現,即:putIfAbsent,removereplace(2重載)。

+17

如果你可以忍受更多的工作,對mutable使用'synchronized'方法直接收集您需要線程安全的地方。它會爲你節省這個混音帶來的性能。例如。 'someMap.synchronized {someMap + =(「someKey」,「anyValue」)}' – tysonjh

+7

對於任何新查看的人,SynchronizedMap特徵已被棄用爲不夠安全。建議使用Java線程安全集合。 – patwhite

+0

@patwhite:關於這個的任何外部鏈接?似乎很關鍵... – Gepp