Javaのプログラムはマルチスレッドで実行できる。特にServletやJSPなどはマルチスレッドで動かすことが前提なので、マルチスレッドで実行しても問題が発生しない様にスレッドセーフを意識してコーディングする必要がある。
例えば、Webアプリケーションでユーザー情報をスレッドセーフで無い変数に格納しているプログラムがあった場合、タイミングによって他のユーザーの情報が自分の画面に表示されたりといった重大な不具合を混入させてしまう恐れがあり、さらに単体テストでは気づき難い。
インスタンス変数はメソッドの外に定義された変数、クラス変数はインスタンス変数にstaticを付加した変数で、いずれも並行実行した場合、他の実行スレッドから参照される可能性がある。
下記のコードでは、ローカル変数だけがスレッドセーフ。
public class Sample01 {
private String str01; //インスタンス変数
private static String str02; //クラス変数
public static void main(String[] args) {
String str03; //ローカル変数
}
}
ちょっと紛らわしいのですが、下記compはstaticメソッドですが、スレッドセーフです。なぜかというと、インスタンス変数、クラス変数いずれも使用していない為です。
public class Sample01 {
public static int comp(int arg0) {
return arg0++;
}
}
0 件のコメント:
コメントを投稿