2009-07-07 9 views
1

私は複数のスレッドを作成し、デッドロック状況を導入するはずのリアルタイム状況を提案します。これはプロジェクトの一種です。 uの皆さんは、いくつかのリアルタイムの状況で、アプリケーションがよりinterestin作るのを助けることができますMultiThreading and Deadlock

+4

あなたはこれがあなたの割り当てであるとの考えを自分でcomeupする必要があります。 –

+0

「リアルタイム」とは、あなたがこの質問をしているときに宿題が手渡されようとしているということですか? – madlep

答えて

5

あなたはマルチスレッドを証明するために生産者 - 消費者のアルゴリズムを使用することができ哲学者、黄金のフォークおよびスパゲッティ

+0

食事について聞いたことがありますが、黄金のフォークはありますか?偽者は世界で動いた – basszero

+0

これはリアルタイムの例かテキストブックの例ですか? –

+0

これは長い時間前ですが、おそらく私は黄金のフォークを発明しました –

0

の大きなボウルを考えます。

レポートジェネレータ シナリオは、1つのサービス(プロデューサ)によってさらに処理するためにレポートごとのデータがキューに挿入されることがあります。レポートプロセッササービス(コンシューマ)は、レポートのデータをキューから取り出し、一度に1つのレポートを処理します。レポートプロセッササービスには5つの異なるインスタンスがあります。それらのすべては、単一のキュー(これはキューにロックを導入する必要がある場所など)からレポートを消費します。

2

これは、デッドロックが発生します。

public static void main(String[] args) 
{ 
    final Object object1 = new Object(); 
    final Object object2 = new Object(); 

    Thread thread1 = new Thread(
    new Runnable() 
    { 
     public void run() 
     {  
     try 
     {  
      //**** Lock on object1 first **** 
      synchronized(object1) 
      {  
      Thread.sleep(1000); 

      //**** Lock on object2 second **** 
      synchronized(object2) 
      { 
       System.out.println("Should never get here."); 
      } 
      } 
     } 
     catch (InterruptedException e) 
     {  
      System.out.println("Thread interupted."); 
     } 
     } 
    } 
); 

    Thread thread2 = new Thread(
    new Runnable() 
    { 
     public void run() 
     { 
     try 
     { 
      //**** Lock on object2 first **** 
      synchronized(object2) 
      {  
      Thread.sleep(1000); 

      //**** Lock on object1 second **** 
      synchronized(object1) 
      { 
       System.out.println("Should never get here."); 
      } 
      } 
     } 
     catch (InterruptedException e) 
     { 
      System.out.println("Thread interupted."); 
     } 
     } 
    } 
); 

    thread1.start(); 
    thread2.start(); 
} 

基本的には同じオブジェクトのロックに対して競合する2つのスレッドを持っています。スレッド1はobject1にロックを取得し、スレッド2はobject2にロックを取得し、それぞれが別のオブジェクトに対してロックを取得しようとし、別のスレッドがすでにロックしているためデッドロックが発生します。

+0

スリープはデッドロックIMOを保証しません。 –

+0

'sleep'は、それぞれのスレッドが' object2'と 'object1'でそれぞれの最初のロックを取得するまでに(それぞれ' object1'と 'object2'で)2回目のロックを取得しようとしています。 'thread2'が1000ms以内にロックを持っていない可能性はありますが、それはありそうもありません。最終的には、「スリープ」はデッドロックを起こすための単純なメカニズムとして存在しますが、デッドロック自体の原因ではなく、原因は競合するロックです。 –

+0

ありがとうございます。いつもデッドロックに終わるプログラムを書くような質問があるなら、別の方法を考える必要がありますか? –

0

また、固定サイズのスレッドプールでデッドロックすることができます

final ExecutorService exec = Executors.newFixedThreadPool(1); 
exec.submit(new Runnable() { 
    public void run() { 
     Future<?> f = exec.submit(new Runnable() { 
      public void run() { 
      } 
     }); 
     try { f.get(); } catch (Exception ex) { } 
    } 
});