さまざまな理由で、複数のスレッドが同時にアクセスできないコード行がいくつかある scala のコードがあります。
簡単にスレッドセーフにする方法は? Actors モデルを使用できることはわかっていますが、数行のコードでは少しやり過ぎだと思います。
ある種のロックを使用しますが、Google または StackOverflow で具体的な例を見つけることができません。
さまざまな理由で、複数のスレッドが同時にアクセスできないコード行がいくつかある scala のコードがあります。
簡単にスレッドセーフにする方法は? Actors モデルを使用できることはわかっていますが、数行のコードでは少しやり過ぎだと思います。
ある種のロックを使用しますが、Google または StackOverflow で具体的な例を見つけることができません。
synchronized
最も簡単な解決策は、クリティカルセクションに使用することだと思います(Javaの場合と同じように)。そのためのScala構文は次のとおりです。
someObj.synchronized {
// tread-safe part
}
使い方は簡単ですが、ブロックされてデッドロックが発生しやすいため、java.util.concurrentまたはAkkaを参照して、おそらくより複雑ですが、より優れた/非ブロックのソリューションを探すことをお勧めします。
Semaphoresなどの任意の Java 同時実行構成を使用できますが、セマフォはエラーが発生しやすく、使いにくいため、使用しないことをお勧めします。アクターは、ここでそれを行うための最良の方法です。
アクターを作成することは、必ずしも難しいことではありません。scala-lang.org にアクターに関する短いが役に立つチュートリアルがあります: http://www.scala-lang.org/node/242
非常に単純な場合は、同期を使用できます: 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) などもサポートしています。
一般に、スレッド セーフに役立つ不変のデータ構造を持つ純粋な「関数」またはメソッドを使用するようにしてください。