我已经创建了一个具有默认(单例)范围的类的 bean。在类(class)中,我有一个计划每小时运行一次的方法。
public class TaskService implements InitializingBean {
@Scheduled(cron="0 0 */1 * * ?")
public void hourlyReportTask()
{
... code here ...
}
public void performAllTasks()
{
hourlyReportTask();
...
...
}
}
我的应用程序配置看起来像这样,
<bean id="reportService"
class="com.tasks.TaskService" />
我假设运行计划任务的线程将使用相同的 TaskService bean,因为它是在单例范围中创建的。如果应用程序当前正在运行 hourlyReportTask() 并且 Spring 容器启动后台调度线程以同时运行 hourlyReportTask() 会发生什么。它会等待获取 TaskService 实例的访问权限吗?
最佳答案
您的应用程序和调度服务使用完全相同的实例。由于没有同步,因此调度服务可能会在您的应用程序调用该方法时运行该方法。
与将 TaskService
注入(inject)可由多个线程同时访问的内容中的方式几乎相同,并且这些线程同时调用该方法。
@Scheduled 背后没有黑魔法:它以与手动相同的方式调用您的方法。如果该方法不是线程安全的,则需要使用 Java 中的常规同步机制(例如,将 synchronized
关键字添加到方法声明中)。
关于java - Spring @Scheduled 注解和 Singleton 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669602/