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);
假设我有一个调度程序
@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);