我在scala中有一个代码,由于各种原因,几行代码无法同时被更多线程访问。
如何轻松使其线程安全?我知道我可以使用Actors模型,但我发现它对于几行代码来说太过分了。
我会使用某种锁,但我无法在谷歌或StackOverflow上找到任何具体的例子。
答案 0 :(得分:15)
我认为最简单的解决方案是将synchronized
用于关键部分(就像在Java中一样)。这是Scala的语法:
someObj.synchronized {
// tread-safe part
}
它易于使用,但它会阻塞并且很容易导致死锁,因此我建议您查看java.util.concurrent或Akka,可能是更复杂但更好/无阻塞的解决方案。
答案 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)
通常尝试使用纯'函数'或带有不可变数据结构的方法,这些数据结构应该有助于线程安全。