- ベストアンサー
synchronizedを施しているのに... java初心者です。宜しくお願い致します。
- スレッドのsynchronizedメソッドが連続した処理として実行されない場合があるので、その原因を解説してもらえると助かります。
- 具体的なコードを提供しましたので、解析して教えていただけると嬉しいです。
- Java初心者がsynchronizedを理解するためのサンプルコードの実行結果がおかしいので、解説してもらえると助かります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>あるスレッドがsynchronizedのメソッドを実行すると、そのメソッドの仕事は連続したひとかたまりの処理として実行される 言葉としてはそういえますが、微妙な表現ですね……。 例えば、この例でいえば、ちゃんとrunメソッド内の処理はまとめて処理されています。ただし、これらはそれぞれが別のスレッドとして動いていますので、それらが同時に実行されれば両者の出力が交じり合う事になります。 「ひとかたまりに実行する」ということを、イコール「その間、他のスレッドは停止して待っている」と考えてはいけません。一連の処理を実行している間も、別のスレッドで処理が実行されていれば、それはそれで動き続けます。 「それじゃ、まとめて処理するってどういう意味なんだ?」と思うでしょう。これは、スレッドの処理ごとに考えるより、「オブジェクト」単位で考えたほうがわかりやすいです。 例えば、こんなクラスがあったとします。 class MyData { int num = 0; } で、mainメソッド内でこのMyDataインスタンスを1つ作成し、MyRunnable10とMyRunnable20の両方のrun内で、この1つのインスタンスに同時にアクセスして値を書き換えたとしましょう。すると、MyRunnable10から値を書き換えた後、その値を利用するまでの間に、MyRunnable20が値を書き換えてしまっているかも知れませんね。 1つのオブジェクトに、同時に複数のスレッドがアクセスし値を操作すると、予想外の結果を引き起こします。したがって、例えばMyRunnable10がMyDataインスタンスを利用するなら、利用し終えるまで他のスレッドから一切アクセスできないようにする必要があります。これがsynchronizedです。 つまり、synchronizedは一連の処理をまとめて実行するというより、「排他的処理」のためのものなのです。あるスレッドがオブジェクトにアクセスしている間、別のスレッドがそのオブジェクトに触れないようにする、それがsynchronizedです。 先のサンプルは、「2つのスレッドが同時にアクセスするオブジェクト」がありませんので、synchronizedの働きが今ひとつよくわからなかったのでしょう。
お礼
早速のご回答、また、解りやすいご解説、ありがとうございました。 原因がよくわかりました。 これからも頑張ろうと思います。