スレッドセーフとは
http://e-words.jp/w/E382B9E383ACE38383E38389E382BBE383BCE38395.html
スレッドセーフができていないというのは
同じインスタンスにある同じ変数を
複数のスレッドが参照・更新できる場合や、
共有ファイルを複数人で参照・更新できる場合
のこと。
例えば
下記コードがあった場合、
private int num;
public int getNum(){
return num;
}
public void setNum(int なむ){
num = なむ;
}
public void update(){
System.out.println(num); //-----(1)
int i;
for(i=0; i < num; i++); //-----(2)
System.out.println(i);
}
- 正常
- スレッドA が Hoge.setNum(10000);実行
- スレッドA が Hoge.update();実行
10000
10000
- 異常
- スレッドA が Hoge.setNum(10000);実行
- スレッドA が Hoge.update();実行
- 「2.」実行中にスレッドBがHoge.setNum(500);実行
おそらく下記のような結果となる。
(1)の直前で「3.」が実行された場合の結果は
500
500
(2)の直前で「3.」が実行された場合の結果は
10000
500
(2)を実行中に「3.」が実行された場合の結果は
10000
"500~10000のいずれか"
対処方法
各メソッドにsynchonized装飾子をつけてあげればとりあえずは防げる。
詳しくは下記
http://d.hatena.ne.jp/amachang/20100324/1269425706
http://www.ibm.com/developerworks/jp/java/library/j-threadsafe/
0 コメント:
コメントを投稿