diary2013-03-14スレッドセーフではないコード(2回目)Java前回(1回目)はサーブレットを例にスレッドセーフではないコードを考えてみたが、スレッドセーフではないことを目に見えるかたちで実証するのが難しかった。SEの環境で動かせるクラスでスレッドセーフではないことを実証してみる。カウントを返すクラスを用意する。nextValue++;}}次に、このカウンターを使うクラスを用意する。mainを起動すると650個のスレッドが立ち上がり、各スレッドは100回カウンターを呼び出す。unsafeSequence.getNext();System.out.println(sequence);}}}mainを実行した結果はどうなっているだろうか?出力結果を降順にソートしてみてほしい。実行環境やタイミングによって異なるが、同じ数値が2度3度と出力され、一番大きい数が「64999」ではないハズだ。私の環境では「64997」だった。期待通り動かすにはどうすればよいか?一番簡単なのはgetNextメソッド自体をsynchronizedにすること。これにより、nextValueにアクセスする唯一のgetNextメソッドがロックによってガードされることになる。ちなみに、nextValueをvolatileにしてもダメ。nextValue++の++が非アトミックな操作なので。常に読み込むバックグラウンドで実行した処理が全て完了するまで待つ月別アーカイブはてなブログをはじめよう!mokimokisanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。