- PR -

getTreeLock() のロックが取れずデッドロック

投稿者投稿内容
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2004-05-28 10:44
まさです。

Swing を使ったアプレットを作っています。
現象はごくたまにしかでないのですが、
画面のいたるところで同様の現象と思われるハングアップが出るので困っています。

今回は、
コード:
public void actionPerformed(ActionEvent ev) {
            :
    //  モーダルダイアログを表示
            :
    //  JOptionPane でメッセージ表示
            :
}


としている部分で、ダイアログは表示されるのに
その次の JOptionPane によるメッセージが表示できずに固まっているようです。

以前、似たような現象が出たときにリモートデバッグしたのですが、
そのときは API 内部で

コード:
synchronized (getTreeLock()) {
            :



としている部分でロックが取得できず固まっていたようです。
他の現象も、発生箇所は違うものの同様のものと思われます。

自モジュール内からは直接 getTreeLock を呼び出している箇所はありません。

・getTreeLock がどういうものなのか?
・getTreeLock のロックが取れないパターンはどういう場合か?
・なぜ getTreeLock のモニタがロックを開放できないのか?

など、いまいちよくわかっていません。
getTreeLock に関して何か情報がありましたらご教授ください。

また、似たような現象になったことがあれば、
そのときの回避策などをご教授ください。

みなさまお助けください。
よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-05-28 12:53
デッドロックしたときはひとまずスレッドダンプをとってみましょう。
Windowsなら DOS プロンプトで ctrl+break
Unix なら kill -3 pid です。
スレッドダンプの読み方はこちらで。
・パフォーマンス・チューニング ガイド - (付録E)Java スタックトレースによるリソース競合検出
http://www1.jpn.hp.com/products/software/development/java/tips/tune/p23.html
実際の解析はこちらで
・侍
http://yusuke.homeip.net/samurai/index.html
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2004-05-28 13:53
まさです。

引用:

Windowsなら DOS プロンプトで ctrl+break
Unix なら kill -3 pid です。


Java-Plugin の場合は、Java コンソール上で "v" ですかね。

最近はたまにしか現象が出ないので、
次回チャンスがあったらダンプを取って解析してみます。
我ながら面倒なバグを作ってしまったもんだ。。。
# たまにしかでないのはバグらしいといえばバグらしいが…

そのほか、何か情報はございませんでしょうか>みなさま
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-05-28 15:25
大丈夫だと思うのですが、イベントディスパッチスレッド以外から
Swingコンポーネントにアクセスしてませんよね。
その辺りの情報は、How to Use Threads(英語)をどうぞ。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-05-29 13:01
unibon です。こんにちわ。

getTreeLock() はhttp://java.sun.com/j2se/1.4/ja/docs/ja/api/java/awt/Component.html#getTreeLock()
のことですよね。JDK のソースコードを見ると、単にロック用の static なインスタンスというだけのようです。

おそらく getTreeLock() が問題となるのは副次的なものであって、本当の原因ではないと推測します。Wataさんがご指摘のようにマルチスレッド絡みなのかもしれません。
あるいは、Java 2D のバグかもしれません。Windows ならば、Java の起動時に -Dsun.java2d.noddraw=true のオプションを付けてみてはどうでしょうか。アプレット(Java PlugIn)ではどこで指定できるのかは良くは知らないのですが、Windows の設定で DirectX を無効にしたり、または画面のプロパティのパフォーマンスの設定でハードウェアアクセラレーターのレベルを最低にすることでも代替できるかもしれません。ハングアップして止まってしまった時のスタックトレースに java2d という文字が見えていたら、まず Java 2D 絡みで間違いないでしょう。
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2004-05-31 12:26
まさです。

引用:

Windows ならば、Java の起動時に -Dsun.java2d.noddraw=true のオプションを
付けてみてはどうでしょうか。
アプレット(Java PlugIn)ではどこで指定できるのかは良くは知らないのですが〜



コンパネ JavaPlugin の設定の 「Java 実行時のパラメータ」 で指定が可能です。


引用:

ハングアップして止まってしまった時のスタックトレースに
java2d という文字が見えていたら、まず Java 2D 絡みで間違いないでしょう。



現象発生時にチェックさせていただきます。


引用:

大丈夫だと思うのですが、イベントディスパッチスレッド以外から
Swingコンポーネントにアクセスしてませんよね。
その辺りの情報は、How to Use Threads(英語)をどうぞ。



げっ!そうなんですか?もしかして Swing の基本!?
「How to Use〜」を見る前に質問してしまい大変失礼ですが、
# これから解読いたします。。。
get 系(参照系)アクセスなら問題ないと思っているのですがあっていますでしょうか?
それとも、get 系アクセスもイベントディスパッチスレッドに
乗っけてあげた方が良いのでしょうか?

意識していなかったので該当箇所があるかもしれません。
見直してみます。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-05-31 17:20
引用:

まささんの書き込み (2004-05-31 12:26) より:
げっ!そうなんですか?もしかして Swing の基本!?
「How to Use〜」を見る前に質問してしまい大変失礼ですが、
# これから解読いたします。。。
get 系(参照系)アクセスなら問題ないと思っているのですがあっていますでしょうか?
それとも、get 系アクセスもイベントディスパッチスレッドに
乗っけてあげた方が良いのでしょうか?

意識していなかったので該当箇所があるかもしれません。
見直してみます。


get系は大丈夫だと思います。多分。実をいうと私も
「他スレッドからアクセスすると、まずいこと(ロックとか)があったりするらしい」
程度にしか理解していないのですけど…。
# 実際にそれが原因でロックするコードはまだ見たことがない。

# ちなみに、SWTでそういう事すると、豪快にRuntimeExceptionが吐き出され、
# プログラムはデッドロックに陥ることもなく、安全に抹殺されます。
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2004-06-01 12:16
まさです。

引用:

# ちなみに、SWTでそういう事すると、豪快にRuntimeExceptionが吐き出され、
# プログラムはデッドロックに陥ることもなく、安全に抹殺されます。



AWT/Swing もこういう風になっていたら。。。


その後、ソースを見直したところ
まずそうな部分が幾つか見つかりました。

# 直すのはいいんですが、
# 現象がめったに出ないだけに効果があったのかなかったのか
# わからなそうですね。あぁ悩ましい。。。

スキルアップ/キャリアアップ(JOB@IT)