3

Scala では、オブジェクトの変更可能な属性 (例えば、数値のバッグ) を持つことを計画している場合、それが適切なのはいつですか?

  1. var を作成し、不変のデータ構造を使用しますか?
  2. val を作成し、変更可能なデータ構造を使用しますか?

スレッド化されたアプリケーションに #2 を使用したいという推測を投げかけますか? 一部のコレクションはスレッドセーフですか?

一般的にはどうですか?(それともあまり関係ない?)

4

2 に答える 2

2

あなたの質問に対する完全な回答ではありませんが…</p>

質問の 1 または 2 は、マルチスレッド環境には適していませんval。不変のデータ構造を持つ s は適しています。可変コレクションへのマルチスレッド アクセスについては、java.util.concurrentパッケージからの Java のコレクションをお勧めします。たとえば、変更可能な同時ハッシュ マップを作成するには、次のようにします。

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

このようなより慣用的な Scala アクセサーを引き続き取得し、特別なアトミック ミューテーター メソッド (def putIfAbsent(k: A, v: B): Option[B]および などdef replace(k: A, oldvalue: B, newvalue: B): Boolean) を使用します。

または、不変のコレクションを保持するを使用しAtomicReferenceて、それをそのcompareAndSetメソッドに置き換えることもできます。

于 2012-04-18T21:21:06.580 に答える
1

選択肢 1 と 2 の間では問題ありません - ミュータブルはミュータブルであり、複数のスレッドから値を読み取ったり変更したりする場合は、プロパティ自体varが不変データ構造またはval可変データ構造の どちらを選択しても、自動同期は行われません。

于 2012-04-19T06:00:29.740 に答える