У меня была эта проблема, поэтому я подумал, что я посмотрю на исходный код.Предполагая, что вы используете стандартную конфигурацию Quartz (хранение заданий и триггеров в оперативной памяти вместо постоянного хранилища 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