以下のソースにて、デッドロックは発生しますか?
※複数回、実行していますが、未だ、デッドロックは発生しておりません。
※標題:徹底攻略Java SE 11 Gold問題集[1Z0-816]対応
初版第一刷
著者:志賀 澄人
発行所:株式会社インプレス
引用頁:550
java
1public class Main { 2 public static void main(String[] args) { 3 Test t1 = new Test(); 4 Test t2 = new Test(); 5 6 Sample s1 = new Sample(); 7 Sample s2 = new Sample(); 8 9 new Thread(() -> { 10 t1.execute(s1, s2); 11 }).start(); 12 13 new Thread(() -> { 14 t2.execute(s1, s2); 15 }).start(); 16 } 17} 18 19class Test { 20 public synchronized void execute(Sample... samples) { 21 for (int i = 0; i < 10; i++) { 22 while (!samples[0].hello(this)) { 23 } 24 while (!samples[1].hello(this)) { 25 } 26 samples[1].bye(); 27 samples[0].bye(); 28 } 29 } 30} 31 32class Sample { 33 public Test test; 34 35 public synchronized boolean hello(Test test) { 36 if (this.test == null) { 37 this.test = test; 38 return true; 39 } 40 return false; 41 } 42 43 public synchronized void bye() { 44 this.test = null; 45 } 46}
引用頁:595
解答
一方のスレッドが1つ目のインスタンスを使っているとき、もう一方のスレッドが2つ目のインスタンスを使っており、それぞれがもう1つのインスタンスを使おうとしたときに、synchronizedによってデッドロックが発生してしまう可能性があります。
実際に動かしてみたらどうなるんでしょうか。
複数回、実行したところ、デッドロックは発生しておりません。
ならそこら辺も質問文に追記しましょう。
今の質問文では丸投げにしかなりません
追記しました。ありがとうございます。
どこにも「一方をロックしたままもう一方のロックを求める」部分が無いように見えるんですが、どこでデッドロックが発生すると思われているのでしょうか。
私自身、デッドロックは発生しないと考えております。掲題のソースは参考書からの引用であり、このソースでデッドロックが発生するとの記載がありました。
書籍からの引用であれば引用元を明記してください。明記する内容は著者名、標題、出版社名、引用したページのページ番号です。
なお、このコメント欄に書くのではありません。質問文を編集して書いてください。
無断での複製、複写が禁じられていたので、掲題のソースを削除しようかと思います。
書籍情報も明記せず、質問をクローズしようかと思います。
> 無断での複製、複写が禁じられていたので、掲題のソースを削除しようかと思います。
引用は無断でできます。そのように著作権法に決めてあります。
質問削除をしないでください。
なに!ありがとうございます。ぱくられるかと思いました。
著作権法
> 第三十二条 公表された著作物は、引用して利用することができる。この場合において、その引用は、公正な慣行に合致するものであり、かつ、報道、批評、研究その他の引用の目的上正当な範囲内で行なわれるものでなければならない。
この場合の「公正な慣行」の一部として、引用元を正確に示すことが必要です。また、写し間違いができるだけ起きないように注意することも必要です。
なお、クラス名MainをAppに書き換えているようです。しかし、著者に無断で意図的に内容を書き換えることは著作者の「同一性保持権」(同法第二十条) を侵すおそれがあります。そういう点でも、引用は正確にお願いします。
私が立ち読みしたのと違うみたいですね。私が見たのは2023年11月1日第1版第5刷ですが、そちらが見ているのは第何刷ですか (本の一番最後のページに書いてあります)。
こちら https://book.impress.co.jp/books/1121101020 の正誤表にも載ってないようですね。
確証を得たければ、問い合わせフォームから問い合わせてみるのがいいと思います。
同じ書籍の考察記事が Qiita にありました。
『徹底攻略 Java SE 11 Gold 問題集』の補足 #Java - 13章 問題33
https://qiita.com/hanohrs/items/d0d3a5288db10b69d2a4#13-%E7%AB%A0-%E5%95%8F%E9%A1%8C-33
本の1番最後のページには、「2021年9月21日 初版発行」と書かれておりますが。。。
正誤表の「第2刷にて修正」と同じ誤りがあるため、第1刷?かと思います。
発行日付からみて初版第1刷ですね (私の見たのはその下に「 2023年11月1日 第1版第5刷発行」と書いてありました)。紙の書籍にしてはかなり頻繁に訂正をしてくれているようです。
初版第5刷は私は立ち読みしただけなので、見間違いもあるかもしれません。一方で、出版社が正誤表に載せていない訂正もあるのかもしれません。機会があったら書店で確かめてみてください。
いろいろ教えていただき、ありがとうございます。正誤表を自分で確認できるようになりました。ありがとうございます。
この本(の第2刷)の "間違い" について問い合わせしすぎて(?) 何かもうアンチになっちゃったみたいな記事がありました。
[Java Goldの黒本に対する批判]
https://qiita.com/kaganatsu/items/049d06131d0ab69f009b
けど、本件の部分については記述は無さそうです。(長いので後半は流し読みになってしまいました。)
書店にて第6刷を見ましたが該当問題も解答も変わっていませんでした。
ありがとうございます!
回答3件
あなたの回答
tips
プレビュー
