質問: スレッドセーフにするべきクラスについて。 スレッドセーフにするべきクラスについて。 マルチスレッドで動くクラスはスレッドセーフにしなければならない。 とよく聞きます。ですが、どのクラスがマルチスレッドで動くのかどうかを判定する基準がよく分かっていません。 例えばサーブレットやjsp、springでシングルトンにしたクラスなどは、スレッドセーフを意識しないといけないんだなと分かります。あとはthreadを拡張したクラスもそうなんだろうと思っています。 ただそれ以外のクラスでスレッドセーフを意識しなければならない場合、どこをみて判断すればよいのでしょうか?サーブレットから呼ばれるアクションクラスはスレッドセーフにしなければいけない・・・? そこのところがよくわかっていないため、クラスを作成する際にメンバ変数に状態を保持する変数を入れて良いんだろうかと悩んでしまいます。 申し訳ありません。アドバイスを頂けると嬉しいです。
回答: あるインスタンスが複数の人(というかスレッド)が共有する このとき、そのコードはスレッドセーフではない、ということよ。 たとえばjavaでアクセスカウンター(累計)を作る。 そしてカウントアップした数字はvm上に保存するとするわね。 この数字は全ユーザがインクリメントする必要があるわ。 そのとき、この数字がスレッドセーフであったら のべアクセス数を出すことができなくなっちゃうわね。 逆を言うと、スレッドセーフでない変数があった場合 その変数はaさんが処理している間にbさんにより書き換えられてしまう恐れがあるわ。 じゃあ、そういう変数を、インスタンスをどう探せばいいのか という問題になるわね。 そのときのキーワードになるのは static よ。 staticな変数がどんな意味を持つのか どんな役割になるのかを考えれば 理由は見えてくると思うわ。