4

さまざまな理由で、複数のスレッドが同時にアクセスできないコード行がいくつかある scala のコードがあります。

簡単にスレッドセーフにする方法は? Actors モデルを使用できることはわかっていますが、数行のコードでは少しやり過ぎだと思います。

ある種のロックを使用しますが、Google または StackOverflow で具体的な例を見つけることができません。

4

4 に答える 4

15

synchronized最も簡単な解決策は、クリティカルセクションに使用することだと思います(Javaの場合と同じように)。そのためのScala構文は次のとおりです。

someObj.synchronized {
    // tread-safe part
}

使い方は簡単ですが、ブロックされてデッドロックが発生しやすいため、java.util.concurrentまたはAkkaを参照して、おそらくより複雑ですが、より優れた/非ブロックのソリューションを探すことをお勧めします。

于 2012-05-23T10:57:54.353 に答える
3

Semaphoresなどの任意の Java 同時実行構成を使用できますが、セマフォはエラーが発生しやすく、使いにくいため、使用しないことをお勧めします。アクターは、ここでそれを行うための最良の方法です。

アクターを作成することは、必ずしも難しいことではありません。scala-lang.org にアクターに関する短いが役に立つチュートリアルがあります: http://www.scala-lang.org/node/242

于 2012-05-23T10:42:28.727 に答える
1

非常に単純な場合は、同期を使用できます: http://www.ibm.com/developerworks/java/library/j-scala02049/index.html

または、jdk の並行パッケージからいくつかのクラスを使用することもできます: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html

アクターを使用したい場合は、akka アクターを使用する必要があります (将来的には akka アクターに置き換わります)。こちらを参照してください: http://doc.akka.io/docs/akka/2.0.1/。また、FSM (Finite State Machine) や STM (Software Transactional Memory) などもサポートしています。

于 2012-05-23T11:00:19.843 に答える
0

一般に、スレッド セーフに役立つ不変のデータ構造を持つ純粋な「関数」またはメソッドを使用するようにしてください。

于 2012-05-23T13:06:03.370 に答える