Spring 调度程序同步方法饥饿

Spring Scheduler synchronized method starvation

假设我有一个调度程序

@Component
public class Scheduler{

    private static int counter = 0;

    private synchronized void countIt(){
        counter++;
    }

    @Scheduled(fixedDelay = 3000)
    public void job1(){
        countIt();
    }

    @Scheduled(fixedDelay = 6000)
    public void job2(){
        countIt();
    }
}

不同case的不同任务触发器会调用countIt。

当两个或多个作业同时调用countIt时,会造成饥饿。

谁能告诉我是否有办法避免这种情况?

这应该不会死锁。

死锁是由一个线程锁定资源 A 然后尝试锁定资源 B 而另一个线程锁定资源 B 然后尝试锁定资源 A.有更复杂的方式可以发生死锁,但只有一个锁不会发生死锁。

在你的例子中只有一个锁,所以没有死锁。

这里没有死锁!

使用具有公平策略的 ReetrantLock。 如果你不知道 ReentrantLock,请 google 它。

private final ReentrantLock lock = new ReentrantLock(true);