4

我在 scala 中有一个代码,由于各种原因,有几行代码无法被更多线程同时访问。

如何轻松使其成为线程安全的?我知道我可以使用 Actors 模型,但我发现它对于几行代码来说有点过分了。

我会使用某种锁,但我在谷歌或 StackOverflow 上都找不到任何具体的例子。

4

4 回答 4

15

我认为最简单的解决方案是synchronized用于关键部分(就像在 Java 中一样)。这是它的Scala语法:

someObj.synchronized {
    // tread-safe part
}

它很容易使用,但它会阻塞并且很容易导致死锁,因此我鼓励您查看java.util.concurrentAkka可能更复杂但更好/非阻塞的解决方案。

于 2012-05-23T10:57:54.353 回答
3

您可以使用任何 Java 并发构造,例如Semaphores,但我建议不要这样做,因为信号量容易出错并且使用起来很笨重。演员在这里真的是最好的方式。

创建演员不一定很难。在 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

如果你想使用actors,你应该使用akkaactors(他们将在未来取代scalaactors),见这里:http ://doc.akka.io/docs/akka/2.0.1/ 。它们还支持诸如 FSM(有限状态机)和 STM(软件事务内存)之类的东西。

于 2012-05-23T11:00:19.843 回答
0

一般来说,尝试使用具有不可变数据结构的纯“函数”或方法,这应该有助于线程安全。

于 2012-05-23T13:06:03.370 回答