如何在scala中使代码线程安全?

时间:2012-05-23 10:37:55

标签: scala

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

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

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

4 个答案:

答案 0 :(得分:15)

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

someObj.synchronized {
    // tread-safe part
}

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

答案 1 :(得分:3)

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

创造演员并不一定很难。在scala-lang.org上有一个关于演员的简短但有用的教程:http://www.scala-lang.org/node/242

答案 2 :(得分:1)

如果它非常简单,您可以使用synchronized: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

如果你想使用actor,你应该使用akka actor(他们将来会替换scala actor),请参阅:http://doc.akka.io/docs/akka/2.0.1/。它们还支持FSM(有限状态机)和STM(软件事务存储器)等。

答案 3 :(得分:0)

通常尝试使用纯'函数'或带有不可变数据结构的方法,这些数据结构应该有助于线程安全。