我有两个演员和一个知识库,这样安全吗?
def incRepo = {
val acc = Repo get "account"
Repo set "account" = acc + 1
}
Actor1 = Actor2 = def receive = {
case inc =>
incRepo
}
答案 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代码比使用锁更容易。