2016-10-14 4 views
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を呼び出します持っていると仮定します。

複数のジョブコールカウントが同時に発生した場合、それはスタベーションを引き起こします。

この状況を回避する手段があるかどうか教えてください。

+3

デッドロックのケースのようには見えません – AdamSkywalker

+0

@AdamSkywalker実際のケースは少し複雑です。私は多くのスレッドがこの同期メソッドを呼び出している。彼らが同じ時間にメソッドを呼び出すと、デッドロックが発生しました。 – Roy

+2

デッドロックは、スレッド1がリソースAを保持し、リソースBを必要とし、スレッド2がリソースBを保持しリソースAを必要とする状況です。同期メソッドはミューテックスで、デッドロックを引き起こすことはありません – AdamSkywalker

答えて

0

ここにデッドロックはありません!

FairポリシーでReetrantLockを使用してください。 ReentrantLockがわからない場合は、Googleにお知らせください。

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

それは私が探しているようです、私はそれを最初に試してみましょう – Roy

0

これはデッドロックしません。

デッドロックは、一つのスレッドロッキングリソースAに起因して、別のスレッドのロックがBリソースと、リソースAをロックしようとしながら、リソースBをロックしようとしています。デッドロックが発生するより複雑な方法がありますが、デッドロックは1つのロックでは発生しません。

あなたのケースでは、ロックが1つしかないので、デッドロックはありません。

関連する問題