问题描述
Spring Quartz是很常用的定时任务框架。把一个Quartz
的工程部署到Tomcat
中启动,意外地发现,每个Task
都在同一时间跑了两次,而本地在开发的过程中却没有问题。
问题排查
为了防止多线程问题,有部分Task
上是加了锁的,类似如下方式:
@Component
public class ExampleTask{
private ReentrantLock lock = new ReentrantLock();
protected void executeInternal(){
if (lock.tryLock()) {
try {
// task main logic
} finally {
lock.unlock();
}
}
}
}
按理说,Spring
中Bean
默认是单例的,加了锁之后,同一时间,只会有一个线程能拿到锁,然后执行Task
的逻辑才对。难道锁不生效?于是我们又新增了类似如下日志,把ReentrantLock
对象和this
都打印出来:
logger