多个线程可以同时安全地调用Scheduler返回的StdSchedulerFactory实例上的方法吗?
答案 0 :(得分:9)
我有这个问题,所以我想看看源代码。假设您使用的是Quartz的标准配置(在RAM中存储作业和触发器而不是持久的JobStore),那么Quartz似乎是线程安全的。
深入了解源代码,您将最终访问RamJobStore,它将所有作业和触发器存储在内存中。
public void storeJobAndTrigger(SchedulingContext ctxt, JobDetail newJob,
Trigger newTrigger) throws JobPersistenceException {
storeJob(ctxt, newJob, false);
storeTrigger(ctxt, newTrigger, false);
}
在storeJob(..)和storeTrigger(..)方法的每一个中,都有单独的同步块及其自己的唯一对象,用于以线程安全的方式存储作业和触发器:
synchronized (jobLock) {
if (!repl) {
// get job group
...
}
}
同步触发器:
synchronized (triggerLock) {
...
synchronized (pausedTriggerGroups) {
...
}
}
简而言之,您似乎可以对Scheduler类的实例进行线程安全调用
答案 1 :(得分:2)
This post证实了这一点。