在Scala中,如果我打算在具有可變屬性的對象(例如數的包),什麼時候適合於易變值
- 創建一個VAR和使用一個不變數據結構?
- 創建一個val並使用可變數據結構?
我想拋出一個猜測,你想使用#2線程應用程序?某些集合是否是線程安全的?
一般情況如何? (或者它不是真的重要嗎?)
在Scala中,如果我打算在具有可變屬性的對象(例如數的包),什麼時候適合於易變值
我想拋出一個猜測,你想使用#2線程應用程序?某些集合是否是線程安全的?
一般情況如何? (或者它不是真的重要嗎?)
在你的選擇1和2之間,沒關係 - mutable是可變的,如果你從多個線程讀取或修改值,你需要同步訪問屬性,不管屬性本身是不可變數據結構的var
或可變數據結構的val
。這兩種選擇都不會讓你自動同步。
不是一個完整的回答你的問題,但是...
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
方法。