演员线程安全

时间:2016-03-05 22:00:48

标签: multithreading scala thread-safety akka actor

我有两个演员和一个知识库,这样安全吗?

def incRepo = {
  val acc = Repo get "account"
  Repo set "account" = acc + 1
}

Actor1 = Actor2 = def receive = {
  case inc => 
    incRepo
}

1 个答案:

答案 0 :(得分:4)

没有。存在竞争条件,因为Actors在单独的线程中执行。即。 Actor1执行get操作。然后Actor2多次执行整个incRepo。然后Actor1执行set动作。

您可能希望使用ScalaSTM库来查看“软件事务内存”。

您可以创建共享Ref并使incRepo成为atomic功能。当多个线程进入atomic块时,两者都继续。写入Ref的第一个线程获胜,失败者从头开始重新启动atomic块。因此,两个线程将始终使用最新数据。

https://nbronson.github.io/scala-stm/

STM是Locks和Mutexes的替代品,但具有更好的并发性,因为它使用乐观的非阻塞写入而不是阻塞写入和读取。编写和维护STM代码比使用锁更容易。