微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AkkaSystem.scheduler() 和 AkkaSystem.dispatcher() 是否作为单线程工作?

如何解决AkkaSystem.scheduler() 和 AkkaSystem.dispatcher() 是否作为单线程工作?

我正在做一个 Akka 项目,遇到了这样的代码

akkaScheduler.scheduleOnce(duration,() -> {
    // Access a map
}),dispatcher)

此处将 akkaScheduler 指定为 akkaSystem.scheduler(),将 dispatcher 指定为 akkaSystem.dispatcher()

因为有很多scheduleOnce,而且这些Runnables可能同时触发,我想知道它们是否会从不同的线程同时“访问地图”?即我应该在这里使用线程安全映射(如 ConcurrentHashMap)吗?

解决方法

这取决于特定的调度程序/执行程序/执行上下文,但总的来说,多个任务可以在不同线程上同时执行是一个安全的假设。因此,如果调度任务,重要的是要确保它们不关心并发突变(例如它们是幂等的),或者任何突变都涉及某种同步方法以防止并发突变。

使用线程安全的结构就是这样一种方式,然而,更符合 Akka 习惯的方法是只通过 actor 公开结构(它本身不需要是线程安全的)并且让计划任务只发送消息给那个演员。虽然这样做可能比使用 ConcurrentHashMap(或其他)更重,但它有几个显着的好处:

  • 它可以感知集群(例如通过成为集群单例或使用分布式数据)和/或持久化(通过 Akka Persistence)
  • 通过公开更丰富的域特定/域意义协议(“更丰富”的意思是“足够丰富以至于没有什么(包括计划任务)需要发送多条消息”),您可以获得非常牢固的事务语义

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。