いつもお世話になっております。
以下のコードで、デッドロックが発生してしまっているようなのですが、なぜデッドロックになっているのでしょうか。
showメソッドの排他制御が原因でデッドロックになっているということまでは分かっているのですが、排他制御についての理解が乏しく、なぜデッドロックになっているのかが分かっておりません。
以下問題集の内容抜粋
Java
1public class Test { 2 3 public static void main(String[] args) { 4 // TODO 自動生成されたメソッド・スタブ 5 6 CountThread c1 = new CountThread(); 7 CountThread c2 = new CountThread(); 8 c1.setCountThread(c2); 9 c2.setCountThread(c1); 10 c1.start(); 11 c2.start(); 12 } 13} 14 15class CountThread extends Thread { 16 CountThread c; 17 int i = 0; 18 19 public void setCountThread(CountThread c) { 20 this.c = c; 21 } 22 23 public synchronized void display(CountThread c) { 24 try { 25 Thread.sleep(10); 26 c.show(); 27 } catch (InterruptedException e) { 28 29 } 30 } 31 32 public synchronized void show() { 33 System.out.println(c.getName()); 34 } 35 36 public void run() { 37 display(c); 38 } 39 40} 41
そもそもですが、コードの意図が分かりません。c1.setCountThread(c2); と、c1のインスタンスにc2を預け、c2にc1を預けているのは何故でしょう。やりたいことが分からないです。synchronizedメソッドが思いっきり競合しているように見えます。何か、排他制御したいリソースをカウントしたい意図があるのでしょうか。c.getName()と、getNameインスタンスメソッドが見当たりませんが、コードの一部なのでしょうか。
行番号はいれないでください。
マークダウン記法の意味がありません
dodox86さん
実はこれは私が書いたものではなく、問題集のコードです。
なので、私が意図して書いたソースコードではありません。
getNameメソッドについては、CountThread extends Threadとなっており、Threadクラスを継承しているため、ThreadクラスのgetNameメソッドを呼び出しているようです。
asahina1979さん
行番号は削除致しました。
> 実はこれは私が書いたものではなく、問題集のコードです。
なるほど、デッドロックするコードなので、その原因を探って直せ、と言う問題だということですか。
コードをコンパイル、実行するとどういう結果になりますいか?という問題で、答えがデッドロックになるという解答になっております。
私の理解が乏しく、なぜそのようになっているのかが分からず、質問をさせていただいた次第です。
問題集の問題ならその旨を書きましょう。
asahina1979さん
追記致しました
回答2件
あなたの回答
tips
プレビュー