1

假设我有一个调度程序

@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();
    }
}

不同情况下不同的任务触发器会调用countIt。

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

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

4

2 回答 2

0

这不应该死锁。

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

在您的情况下,只有一个锁,因此没有死锁。

于 2016-10-14T12:27:21.220 回答
0

这里没有僵局!

使用具有公平政策的 ReetrantLock。如果你不知道 ReentrantLock 请谷歌它。

private final ReentrantLock lock = new ReentrantLock(true);
于 2016-10-14T13:50:29.053 回答