【问题标题】:Reader Writer Lock using Actor Model in Akka在 Akka 中使用 Actor 模型的 Reader Writer Lock
【发布时间】:2016-03-17 15:18:51
【问题描述】:

我想使用演员模型来实现著名的读写器模型。我们可以有多个读者阅读,但只有一个作家可以写。同样,当作家写作时,没有读者可以阅读,反之亦然。

为了解决这个问题,我想到了使用监督演员来维护读者演员的集合和作家演员的队列。现在,当读者的集合为空时,作者可以出列并开始写作。同样,当作者完成所有读者演员时,该集合中的所有读者演员都可以开始阅读。

我们能否更好地解决这个著名的问题,使用 Actor 模型?

这个模型是否也比使用读或写锁解决的原始读写器问题更好?

【问题讨论】:

    标签: multithreading scala thread-safety akka actor


    【解决方案1】:

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

    您将创建一个具有原子访问权限的共享 Ref。当多个线程进入一个原子块时,都继续。第一个写入 Ref 的线程获胜,失败者从头开始重新启动原子块(并因此重新读取)。因此,两个线程将始终使用最新数据。

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

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

    【讨论】:

    • 谢谢!!我会仔细看看的。还有一种方法可以使用 Actor 模型来解决这种问题,因为它在我的项目的其他部分中被大量使用
    • 是的,STM可以和Actor一起使用。您将创建一个单例 Ref 来封装您的共享对象,并且参与者将以原子方式访问数据。
    • 它使用scala.blocking吗?当演员在屏障上等待时,它会导致产生额外的线程吗?见stackoverflow.com/a/31110111/1387612
    【解决方案2】:

    您可以简单地创建一个主管 Actor 来管理传入的请求。 然后,主管 Actor 可以向阅读器 Actor 发送消息。当读者发回确认时,写请求可以转发给写者Actor。

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2018-08-10
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多