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

ny6fqffe  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(380)

我在一个akka项目中遇到了这样的代码:

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

在这里 akkaScheduler 分配为 akkaSystem.scheduler() 以及 dispatcher 分配为 akkaSystem.dispatcher() .
因为有很多 scheduleOnce 而这些runnable可能会同时触发,我想知道它们是否会从不同的线程同时“访问一个map”?i、 我应该在这里使用线程安全Map(比如concurrenthashmap)吗?

yebdmbv4

yebdmbv41#

它取决于特定的dispatcher/executor/execution上下文,但一般来说,可以安全地假设多个任务可以在不同的线程上同时执行。因此,如果调度任务,重要的是要确保它们或者不关心并发变异(例如,它们是幂等的),或者任何变异都涉及一些同步方法来防止并发变异。
使用线程安全的结构就是这样一种方式,然而,更为akka惯用的方式是只通过一个actor公开这个结构(它本身不需要是线程安全的),并且让调度任务只向该actor发送消息。但这样做可能比使用 ConcurrentHashMap (或者别的什么),它有几个显著的好处:
它可以成为集群感知(例如,通过成为集群单例或使用分布式数据)和/或持久性(通过akka持久性)
通过公开一个更丰富的域特定/域有意义的协议(“更丰富”的意思是“足够丰富,不需要任何东西(包括计划的任务)来发送多条消息”),您可以获得非常坚定的事务语义

相关问题