2016-09-12 2 views
1

このコードでデッドロックが発生する可能性はありますか?デッドロック - このプログラムのデッドロックは可能ですか?

私はそれを何回も実行したが、1つも持っていなかったが、デッドロック状況が可能かどうかの説明を求める。

public class DeadlockTest { 
    public static void main(String[] args) { 
    ReentrantLock[] locks = new ReentrantLock[3]; 
    for (int i = 0; i < 3; i++) { 
     locks[i] = new ReentrantLock(); 
    } 
    WorkerThread[] threads = new WorkerThread[3]; 
    for (int i = 0; i < 3; i++) { 
     threads[i] = new WorkerThread(locks[i], locks[(i+1)%3]); 
     threads[i].start(); 
    } 
    } 
} 

class WorkerThread extends Thread { 
    private ReentrantLock l1; 
    private ReentrantLock l2; 
     public WorkerThread(ReentrantLock l1, ReentrantLock l2) { 
     this.l1 = l1; 
     this.l2 = l2; 
     } 
    public void run() { 
    l1.lock(); 
    l2.lock(); 
    System.out.println("Working now."); 
    l1.unlock(); 
    l2.unlock(); 
    } 
} 
+1

これは、よく知られているダイニング哲学者の単純化された変形です。以前は3つではなく5つでしたが、この場合は違いはありません。あなたは '食事の哲学者 'のためにウェブを検索したいかもしれません。読むには面白いものがたくさんあります。 –

+0

[4つのよく知られたデッドロックの条件](http://users.cs.cf.ac.uk/OFRana/os/lectureos12/node2.html)があります。これらの条件のうちどれを適用すると思いますか)このコードのために? –

+0

私はこれが学校の割り当ての質問だった感じを得る – Gikkman

答えて

3

ここでデッドロックの可能性は確かにあります:

  • スレッド0はこの順で、ロック0と1を試してみて、開催します。
  • スレッド1は、ロック1と2をこの順序で試行して保持します。
  • スレッド2は、ロック2と0をこの順序で試行して保持しようとします。

コードでは、スレッドが「次々に」実行するようにスケジュールを設定していても、基本となるスケジューラが別の方法を選択できることを思い出してください。また、スレッドが現在実行されているためではありませんすべてのコードが実行されます。

このシナリオは可能である:

  • スレッド1がロック1を保持しています。
  • スレッド2はロック2を保持します。
  • スレッド1はロックを試みてロックを保持します2:スレッドはブロックされません。
  • スレッド0はロック0を保持します。
  • スレッド2はロックを試みてロックを保持します0:スレッドはブロックされません。
  • スレッド0はロックしようとします。ロック1:スレッドはブロックされません。

デッドロック!

0

fgeさんはあなたの質問に対して、はっきりとした答えを与えました。それでもあなたがそれを実行するときにデッドロックされていないのはなぜかと思うかもしれません。

はちょうどl1.lock後()

try 
    { 
     Thread.sleep(10); 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 

を追加しよう。

デッドロックが発生する可能性があります。

関連する問題