http://oshiete1.goo.ne.jp/qa2968378.html
で質問した者です。
2つのスレッドで1と2を交互に実行する以下のプログラム。
final Object obj1 = new Object(); //スレッド間通信用のobject
final Object obj2 = new Object(); //スレッド間通信用のobject2
Thread t1 = new Thread() {
public void run() {
try {
while(true) {
System.out.print("1");
synchronized (obj1) {
synchronized (obj2) {
obj2.notify();//相手をnotifyして
}
obj1.wait();//自分はwait
}
}
} catech (Exception e){}
};
Thread t2 = new Thread() {
public void run() {
try {
while(true) {
System.out.print("2");
synchronized (obj2) {
synchronized (obj1) {
obj1.notify();
}
obj2.wait();
}
}
} catch (Exception e){}
}
};
Thread t1 = new Test1();
Thread t2 = new Test2();
t1.start();
while(t1.getState() != Thread.State.WAITING);
t2.start();
が思ったように動いてはいるものの、なぜ正常に動いているかがわかりません。
t1が wait() したときはobj1のロックをもっていて、t2の
synchronized (obj1){obj1.notify()} ブロックに入れず待機するはずだと思うのですが。
なぜちゃんと動いているのでしょう?
No.1ベストアンサー
- 回答日時:
直接的な回答は、
「obj1.wait();時にはobj1のロックは解除されるので」
また、そのコードだと、
1. Test1:synchronized (obj1) Test2:synchronized (obj2)
2. Test1:synchronized (obj2) Test2:synchronized (obj1)
の順に動作した場合にデッドロックを起こす可能性が残っていると思います(再現性が落ちただけ)
多分、volatileな状態を組み合わせるなどしないと回避できないと思います。
# なぜ、スレッド構成での直列化にこだわっているのかの背景を知らない身からすると、
# 無駄に大変な努力をすることになるように感じますので、
# 個人的には、前回スレの回答者のご意見を推奨しておきます。
お返事遅れて申し訳ありません。
監視スレッドを使いたくなかった理由は、監視スレッドでwhile()を回すと余計に資源を食いそうだった点と、単に2つでそのようなことが出来るか知りたかった点です。
上記の方法でもデッドロックが生じる可能性があることも承知致しました。
またよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 S/TのとこのSなんですが、S=1/2OA×OB×sin角AOBでOA×OBは1×1みたいなんですが 3 2022/05/30 12:53
- 数学 このようなベクトルOPをOA OBで表す問題でよく、図のようにs:1-sで置くと思うんですけど、AP 4 2022/08/08 10:25
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- 数学 数学(三角比) 四面体OABCについて、「OA=1」「OB=√2」「OC=2」「OA⊥OB」「OB⊥ 1 2023/02/13 21:22
- ゴルフ ゴルフ初心者です。基本的なゴルフの事でなのですがプレイング4が無いホールのティーショットでOBを出し 4 2023/08/07 23:25
- 数学 数学 解答三行目の →OC=−(→OA+→OB) −(→OC)=→OA+→OB にして計算していって 2 2023/08/09 13:48
- 数学 ベクトルと図形の問題で、 △OABの、辺OA、OB上にそれぞれ内分点P、Qがあって(比は分かっている 2 2022/08/01 10:55
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- サッカー・フットサル Jリーグの話 1 2022/12/02 23:19
- 野球 落合時代の中日では… 1 2022/11/10 20:40
関連するカテゴリから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のスレッドを破棄する方法
おすすめ情報