2012-04-18 39 views
3

在Scala中,如果我打算在具有可變屬性的對象(例如數的包),什麼時候適合於易變值

  1. 創建一個VAR和使用一個不變數據結構?
  2. 創建一個val並使用可變數據結構?

我想拋出一個猜測,你想使用#2線程應用程序?某些集合是否是線程安全的?

一般情況如何? (或者它不是真的重要嗎?)

回答

1

在你的選擇1和2之間,沒關係 - mutable是可變的,如果你從多個線程讀取或修改值,你需要同步訪問屬性,不管屬性本身是不可變數據結構的var或可變數據結構的val。這兩種選擇都不會讓你自動同步。

2

不是一個完整的回答你的問題,但是...

1或2個在你的問題不會爲多線程環境是適合 - val s的不可變數據結構是。對於多線程訪問可變集合,我仍然推薦來自java.util.concurrent包的Java集合。例如,創建一個可變的,併發的哈希表:

def emptyConcurrentHashMap[K, V] = { 
    import collection.JavaConverters._ 
    new java.util.concurrent.ConcurrentHashMap[K, V].asScala 
} 

您仍然獲得更地道斯卡拉訪問器這樣的,你應該使用特殊的原子mutator方法(如def putIfAbsent(k: A, v: B): Option[B]def replace(k: A, oldvalue: B, newvalue: B): Boolean)。

或者,您可以使用包含不可變集合的AtomicReference,並將其替換爲compareAndSet方法。