我在一个akka项目中遇到了这样的代码:
akkaScheduler.scheduleOnce(duration, () -> {
// Access a map
}), dispatcher)
在这里 akkaScheduler
分配为 akkaSystem.scheduler()
以及 dispatcher
分配为 akkaSystem.dispatcher()
.
因为有很多 scheduleOnce
而这些runnable可能会同时触发,我想知道它们是否会从不同的线程同时“访问一个map”?i、 我应该在这里使用线程安全Map(比如concurrenthashmap)吗?
1条答案
按热度按时间yebdmbv41#
它取决于特定的dispatcher/executor/execution上下文,但一般来说,可以安全地假设多个任务可以在不同的线程上同时执行。因此,如果调度任务,重要的是要确保它们或者不关心并发变异(例如,它们是幂等的),或者任何变异都涉及一些同步方法来防止并发变异。
使用线程安全的结构就是这样一种方式,然而,更为akka惯用的方式是只通过一个actor公开这个结构(它本身不需要是线程安全的),并且让调度任务只向该actor发送消息。但这样做可能比使用
ConcurrentHashMap
(或者别的什么),它有几个显著的好处:它可以成为集群感知(例如,通过成为集群单例或使用分布式数据)和/或持久性(通过akka持久性)
通过公开一个更丰富的域特定/域有意义的协议(“更丰富”的意思是“足够丰富,不需要任何东西(包括计划的任务)来发送多条消息”),您可以获得非常坚定的事务语义