12:56:01ツイート印刷コメントを書くJavaは言語レベルでマルチスレッド化されています。マルチスレッドであるからこそ、適切に同期をとる必要があります。今回は、オブジェクトのロックのテストをやってみました。今回のサンプルプログラムの動きは以下のような感じです。・HttpClientがきちんと行数をカウントし終えるまで本体ObjLockTestが待機できるかどうか試してみる。{System.out.println("HttpClientの処理の終了を待ちます。");//HttpClientのロック開放を待つhc.wait();System.out.println("HttpClientの処理が終了しました。cnt;}}ブログ内でのソースの読みやすさを考え、ちょっと気持ちの悪いところで折り返しています。実際に動かしてみると、こんな感じです。行数の取得は思ったよりも早く終わります。行数を取得できていますね。synchronizedブロックで対象のオブジェクトのロックを取得し、wait()メソッドでロックの開放を待ちます。対象のオブジェクトは自身のsynchronizeブロック内で自分自身のロックを取得し、他のオブジェクトがsynchronizeブロック内にアクセスする事を排他します。目的の処理が終わったらnotify()メソッドで、待機中のオブジェクトにロックの開放を通知します。「実行状態」になるわけではないのがポイントです。実行可能な状態にはなりますが、はたして通知を受けたどのオブジェクトが実際に実行されるかは、JVM任せになり、プログラマは把握できません。ここで、仮に、本体側のsynchronizeブロックをコメントアウトすると、どうなるでしょうか?当然、行数のカウントが終わる前に、行数を表示する行に到達してしまうはずですよね。{System.out.println("HttpClientの処理の終了を待ちます。");//HttpClientのロック開放を待つ//hc.wait();System.out.println("HttpClientの処理が終了しました。"行");}}当然、こうなります。ブロガーにより投稿されたものです。Japan編集部の見解・意向を示すものではありません。permission.×このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。