- - PR -
getTreeLock() のロックが取れずデッドロック
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-05-28 10:44
まさです。
Swing を使ったアプレットを作っています。 現象はごくたまにしかでないのですが、 画面のいたるところで同様の現象と思われるハングアップが出るので困っています。 今回は、
としている部分で、ダイアログは表示されるのに その次の JOptionPane によるメッセージが表示できずに固まっているようです。 以前、似たような現象が出たときにリモートデバッグしたのですが、 そのときは API 内部で
としている部分でロックが取得できず固まっていたようです。 他の現象も、発生箇所は違うものの同様のものと思われます。 自モジュール内からは直接 getTreeLock を呼び出している箇所はありません。 ・getTreeLock がどういうものなのか? ・getTreeLock のロックが取れないパターンはどういう場合か? ・なぜ getTreeLock のモニタがロックを開放できないのか? など、いまいちよくわかっていません。 getTreeLock に関して何か情報がありましたらご教授ください。 また、似たような現象になったことがあれば、 そのときの回避策などをご教授ください。 みなさまお助けください。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 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 | ||||||||||||
|
投稿日時: 2004-05-28 13:53
まさです。
Java-Plugin の場合は、Java コンソール上で "v" ですかね。 最近はたまにしか現象が出ないので、 次回チャンスがあったらダンプを取って解析してみます。 我ながら面倒なバグを作ってしまったもんだ。。。 # たまにしかでないのはバグらしいといえばバグらしいが… そのほか、何か情報はございませんでしょうか>みなさま | ||||||||||||
|
投稿日時: 2004-05-28 15:25
大丈夫だと思うのですが、イベントディスパッチスレッド以外から
Swingコンポーネントにアクセスしてませんよね。 その辺りの情報は、How to Use Threads(英語)をどうぞ。 | ||||||||||||
|
投稿日時: 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 絡みで間違いないでしょう。 | ||||||||||||
|
投稿日時: 2004-05-31 12:26
まさです。
コンパネ JavaPlugin の設定の 「Java 実行時のパラメータ」 で指定が可能です。
現象発生時にチェックさせていただきます。
げっ!そうなんですか?もしかして Swing の基本!? 「How to Use〜」を見る前に質問してしまい大変失礼ですが、 # これから解読いたします。。。 get 系(参照系)アクセスなら問題ないと思っているのですがあっていますでしょうか? それとも、get 系アクセスもイベントディスパッチスレッドに 乗っけてあげた方が良いのでしょうか? 意識していなかったので該当箇所があるかもしれません。 見直してみます。 | ||||||||||||
|
投稿日時: 2004-05-31 17:20
get系は大丈夫だと思います。多分。実をいうと私も 「他スレッドからアクセスすると、まずいこと(ロックとか)があったりするらしい」 程度にしか理解していないのですけど…。 # 実際にそれが原因でロックするコードはまだ見たことがない。 # ちなみに、SWTでそういう事すると、豪快にRuntimeExceptionが吐き出され、 # プログラムはデッドロックに陥ることもなく、安全に抹殺されます。 | ||||||||||||
|
投稿日時: 2004-06-01 12:16
まさです。
AWT/Swing もこういう風になっていたら。。。 その後、ソースを見直したところ まずそうな部分が幾つか見つかりました。 # 直すのはいいんですが、 # 現象がめったに出ないだけに効果があったのかなかったのか # わからなそうですね。あぁ悩ましい。。。 |