人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javaの質問です。マルチスレッド系は最近始めたばかりなのですが、2つのオブジェクトの両方が利用可能になるまで待たせるつもりでsynchronizedブロックを2重に使ったところ、ソースコードを見た人に笑われました。何がいけないのでしょうか?

●質問者: westfish
●カテゴリ:コンピュータ
✍キーワード:Java オブジェクト スレッド ソースコード ブロック
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kurukuru-neko
●15ポイント

普通しないですね。

ブロックを2重にしている事は最初で排他されている

状態を保持したままなので、2つ目は既に排他

された状態ですから、同時実行されませんから。

最悪デッドロックですね。

http://www.ipa.go.jp/security/awareness/vendor/programming/a03_0...

◎質問者からの返答

おっしゃっていることがよくわかりませんが、質問文がわかりにくかったでしょうか?例えばVector a;とVector b;があった場合に、その両方に対して操作を行うコードをsynchronized(a)とsynchronized(b)の両方で囲むと言いたかったのですが…。aとbに対するロックの順番が常に同じであればデッドロックにはならないのではないかと思います。


2 ● kurukuru-neko
●30ポイント

>aとbに対するロックの順番が常に同じであれば

>デッドロックにはならないのではないかと思います。

普通そのようなことをデッドロックする可能性が

あるといいます。

約束を守っていれば大丈夫はよくあるデッドロック

の原因です。(複数ロックの問題もある)

14.17 synchronized 文

http://www.y-adagio.com/public/standards/tr_javalang/14.doc.htm

14.18 synchronized

http://java.sun.com/docs/books/jls/second_edition/html/statement...

想像ですが笑った理由は、排他対象が1つ2つならまだしも

多数に増えたや、後の保守等を考えた場合、無理があると

思ったように思ったと思います。

間違った使い方というわけではありません。

http://www.netgene.co.jp/java/concurrentTips.html

17.13 ロック及び同期

http://www.y-adagio.com/public/standards/tr_javalang2/memory.doc...

http://www-06.ibm.com/jp/developerworks/java/041112/j_j-jtp10264...

http://www-06.ibm.com/jp/developerworks/java/041203/j_j-jtp11234...

http://www-06.ibm.com/jp/developerworks/java/library.html

http://www-06.ibm.com/jp/developerworks/java/020726/j_j-dcl.html

http://www.javaroad.jp/index_basic.htm#thread


3 ● b-wind
●35ポイント

2重のブロックだけだと特に変なことでもないので(デッドロックにならないよう注意は必要ですが)、そのほかの部分で何かあるのではないかと思います。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ