2016-10-14 2 views
1

Предположим, у меня есть планировщикSpring Scheduler синхронизируется метод голодание

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

Different триггер задачи в другом случае будет вызывать countIt.

При одновременном одновременном вызове двух или более вопросов, это вызовет голод.

Может ли кто-нибудь сказать мне, есть ли способ избежать этой ситуации?

+3

не похож на случай для тупиковой – AdamSkywalker

+0

@AdamSkywalker реальный случай немного сложнее. У меня много потоков, которые называют этот синхронизированный метод. Когда они вызывали метод в одно и то же время, произошел тупик. – Roy

+2

deadlock - это ситуация, когда поток 1 содержит ресурс A и нуждается в ресурсе B, а поток 2 содержит ресурс B и нуждается в ресурсе A. Синхронизированный метод - это мьютекс, только он не может вызвать тупик – AdamSkywalker

ответ

0

Здесь нет тупика!

Использование ReetrantLock с честной политикой. если вы не знаете ReentrantLock, пожалуйста, Google.

private final ReentrantLock lock = new ReentrantLock(true); 
+0

Кажется, что я ищу, Позвольте мне сначала попробовать – Roy

0

Это не должно затормозить.

тупиковый вызывается один резьбовой стопорной ресурса A, а затем пытается заблокировать ресурс B, а другой поток блокировки ресурсов B, а затем пытается заблокировать ресурс A. Есть более сложные способы возникновения взаимоблокировки, но взаимоблокировки не могут произойти только с одним замком.

В вашем случае есть только один замок, поэтому нет тупика.

Смежные вопросы