【问题标题】:Actor Thread SafetyActor线程安全
【发布时间】:2016-03-05 22:00:47
【问题描述】:

我有两个演员和一个存储库,这安全吗?

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

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

【问题讨论】:

    标签: multithreading scala thread-safety akka actor


    【解决方案1】:

    没有。存在竞争条件,因为 Actor 在单独的线程中执行。 IE。 Actor1 执行get 动作。然后 Actor2 将整个incRepo 执行了几次。然后 Actor1 执行set 动作。

    您可能希望使用 ScalaSTM 库研究“软件事务内存”。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2021-07-12
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多