学生です。最近javaの勉強をはじめました。
synchronized statementでデットロック回避のためにwait() notify()の使い方がよくわかりません。本にはwait()はスレッドがsynchronizedで獲得してあるロックを解放し、待機状態に入るとのことを書いてありましたが、なぜ、wait()をwhileループでまわすのでしょうか?
それと、notifyは待機状態のスレッドに対して通知し、通知されたスレッドは待機状態から実行状態に移るとのことですが、whileループで再びwait()を実行し永遠に抜け出せないと思うのですがどうなんでしょうか?
お手数ですが、詳しい方がいらしたら教えていただけないでしょうかお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
evenThreadActionメソッドとoddThreadActionメソッドのc0及びc1が同じオブジェクトを参照するとデッドロック状態になるという認識でよろしいでしょうか?
ちなみに、スレッドのスィッチングは、Thread.sleep(2)の所でしか行われないと言う前提でしょうか?タスクの切替は、VMの仕様としては定義されていません。スィッチングのタイミングは、実装に依存(通常はOS任せ)です。よって、環境によっては、上記したsleepでしか切り替わりませんが、別の環境ではタイムスライス動くかもしれません。
waitとnotifyを何処で使えばデッドロックの回避が出来るかって事ですが、上記の状態にならなければ良いのですから、いずれかのスレッドが、c0を取得した時に、他のスレッドをwaitして、synchronizedを抜けたところで、notify(またはnotiflAll)すれば良さげですが...これだとマルチスレッドの意味無しですね。さらに他のスレッドに対してwaitしようと思ったら、他のスレッドの参照が出来る必要が出てきますね。なんか別の方法がありそうな気がしますが思いつきません。
あまり力になれなかったようで申し訳無い
No.1
- 回答日時:
synchronizedでデッドロック回避と言っても何に対するデッドロックなんでしょか?文面を見る限り、何かソースを見ての疑問のように見うけられますが、そのソースが無いので、なんとも言えません。
抜粋でかまいませんのでソースを載せて頂けませんか。この回答への補足
わざわざありがとうございます。
実はこれは授業の課題なのですが、ソースは研究室のPCにあり、
今、家に帰ってしまったため、載せることができません。
明日になってしまいますが、ソースを載せますのでお手数ですがよろしくお願い致します。
for(int i = 0 ; i < threadNumber ; i++)
new BubbleSort(i, array, mc, latch).start() ;
////////////////////
class BubbleSort extends Thread
{
private int number ;
private Array array ;
private MyCanvas mc ;
private Latch latch ;
BubbleSort(int n, Array a, MyCanvas m, Latch l)
{
number = n ;
array = a ;
mc = m ;
latch = l ;
}
public void run()
{
try{
latch.acquire() ;
if(number % 2 == 0)
evenThreadAction() ;
else
oddThreadAction() ;
System.out.println("****** Completed Thread No." + number) ;
}
catch(InterruptedException e){
}
}
private void evenThreadAction()
{
boolean complete = false ;
while(!complete){
boolean changed = false ;
for(int i = 0 ; i < array.getSize() - 1 ; i++){
Cell c0 = array.getCell(i) ;
synchronized(c0){
Cell c1 = array.getCell(i + 1) ;
synchronized(c1){
if(c0.getValue() > c1.getValue()){
c0.swapValue(c1) ;
changed = true ;
mc.repaint() ;
try{Thread.sleep(2);}catch(InterruptedException e){}
}
}
}
}
if(!changed)
complete = true ;
}
}
private void oddThreadAction()
{
boolean complete = false ;
while(!complete){
boolean changed = false ;
for(int i = array.getSize() - 1 ; i > 0 ; i--){
Cell c0 = array.getCell(i-1) ;
synchronized(c0){
Cell c1 = array.getCell(i) ;
synchronized(c1){
if(c0.getValue() > c1.getValue()){
c0.swapValue(c1) ;
changed = true ;
mc.repaint() ;
try{Thread.sleep(2);}catch(InterruptedException e){}
}
}
}
}
if(!changed)
complete = true ;
}
}
}
上のソースはプログラムのスレッドの処理の部分です。
プログラムの内容はバブルソートアルゴリズムを複数のスレッドを使って行った場合、生成順が奇数のスレッドと偶数のスレッドでアクションが逆なので処理を繰り返していくうちに典型的なデッドロックの状態になるということです。アルゴリズムを変えればデッドロックは回避できますが、そうではなくwait() notify()を使った回避方法を知りたいです。よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- 英語 "I can't wait."って、そのまま「待てない」じゃないんですか? 7 2022/06/16 06:36
- 英語 be sorry for doingとbe sorry to have doneの意味の違いについて 2 2023/06/09 13:57
- ブルーレイ・プレーヤー・レコーダー 東芝vardiaの難しそうな修理 5 2022/09/10 13:26
- 英語 未来なのにwillを使わないことについて 3 2023/06/26 10:48
- 英語 外国人 ウェイウェイ言ってる 3 2022/07/07 10:06
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- テレビ テレビが映るまで3~5分かかります 8 2023/04/11 09:47
- 格安スマホ・SIMフリースマホ SIMカードのロックについて 1 2022/03/29 15:02
- デスクトップパソコン 色々試してもモニター側で信号が検出されませんでしたと表示され、画面が真っ暗な状態になってしまいます。 3 2022/04/04 21:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面系イベントの優先度を上げたい
-
数値の定数を付ける時
-
ラジオボタンの選択判定
-
Delphiのマルチスレッドの割り...
-
tryの終了
-
doGetとdoPostの違い
-
PHPでDB処理中にプログレスバー...
-
java(swing)で、登録ボタンを押...
-
Javaプログラムからポップアッ...
-
C#で別スレッドの終了を知りたい
-
Tomcatのスレッドを破棄する方法
-
ProgressBarが0%から動きません
-
jQueryでdiv作成後まで待ってか...
-
JAVAからJAVASCRIPT関数を呼び出し
-
「UIスレッド」「マルチスレッ...
-
重たい処理のタイムアウト強制終了
-
Javaでのデバッグコード削除
-
Linux上でのTomcatのServletプ...
-
javaのプログラムが止まる
-
[Java] while(true)の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
Tomcat高負荷時の設定について
-
onBlurとonFocusの処理順序につ...
-
Javaでのデバッグコード削除
-
ラジオボタンの選択判定
-
WPF C#でF10のイベント取得方法...
-
doGetとdoPostの違い
-
SwingUtilities.invokeLater(ne...
-
アコーディオンメニューをアン...
-
数値の定数を付ける時
-
switch文の中に、throws new Ex...
-
JAVAからJAVASCRIPT関数を呼び出し
-
再度、スレッドが実行中かどう...
-
ラベルの表示までが異常に遅い...
-
JavaScriptからJAVAクラスを呼...
-
javaのプログラムが止まる
-
Javaプログラムからポップアッ...
-
C#で別スレッドの終了を知りたい
-
vba Sleep関数について教えてく...
-
Tomcatのスレッドを破棄する方法
おすすめ情報