単語の意味
- マルチスレッドプログラミングにおける概念。
- マルチスレッドで動作させても問題のないプログラムのこと。
- コードを複数のスレッドが同時並行的に実行しても問題が発生しないこと。
ある共有データへの複数のスレッドによるアクセスがあるとき、一度に1つのスレッドのみがその共有データにアクセスするようにして安全性を確保しなければならない。
複数人が同時に使用することが前提のアプリケーションではスレッドセーフにしておかないと、「AさんがAさんしか見れてはいけないデータをBさんが意図せず取得してしまう」ような状態になってしまいます。
じゃあどうするか
- Javaの場合は、クラス変数・インスタンス変数は使用せずローカル変数を使用しましょう。
- ただし、staticに使用し変更のない定数はローカル変数以外でも問題ありません。
具体的に、内部でどうなっているか
ローカル変数は、Javaスタック領域というメモリ領域に保持されるため、ひとつのスレッドからしかアクセスされません。
つまり、スレッドにより異なるメモリ領域に保持されており、他のスレッドから参照されたり書き換えられることがないのです。
ちなみに、クラス変数・インスタンス変数は、ヒープ領域というメモリ領域に保持され、その領域は複数のスレッドから参照されます。
注意
Javaプログラムではクラス変数・インスタンス変数を使用しなくても、意図せずJSPで使用してしまうことに気をつけましょう。
<%! int count = 0; %>
JSPは実行時にサーブレットへとコンパイルされますが、上記宣言はインスタンス変数として展開されます。