スレッドの実験 その4Advertisement共有データへのアクセス時の問題点
複数のスレッドでひとつのデータを共有。
こうなるはず。↓ いっこのデータを複数のスレッドが参照。 → 各スレッドでデータ処理 → データ更新 整合性が維持できないはず。 実験。
public class ThreadTest{
public static void main(String args[]){
Bank bnk = new Bank();
ThreadA tha = new ThreadA(bnk);
ThreadB thb = new ThreadB(bnk);
tha.start(); //スレッド A 開始
thb.start(); //スレッド B 開始
try{
tha.join(); //thaの終了待ち
thb.join(); //thbの終了待ち
}catch(Exception e){
System.err.println(e);
System.exit(1);
}
System.out.println(bnk.RefMoney());
}
}
//Bankクラス
class Bank{
private int Account;
public Bank(){
Account = 500;
}
public int RefMoney(){
return Account;
}
public void Deposit(int d){
Account = d;
}
}
class ThreadA extends Thread{
int tmp = 0;
Bank bk;
public ThreadA(Bank b){bk = b;}
public void run(){
tmp = bk.RefMoney(); //参照
tmp = tmp + 1000; //計算
bk.Deposit(tmp); //格納
}
}
class ThreadB extends Thread{
Bank bk;
int tmp = 0;
public ThreadB(Bank b){bk = b;}
public void run(){
tmp = bk.RefMoney();
tmp = tmp + 2000;
bk.Deposit(tmp);
}
}
本当はBankクラスのDeposit()の方で引数としてもらった値をAccountに加算するのがいいんだけど実験のため。何回か実行するうちにmainの最後のprintln()メソッドの出力結果がおかしくなるはず。 とりあえず実行。 3500何回やっても3500。バッチファイル作って1000回やっても全部3500。そこで力技。
public void run(){
tmp = bk.RefMoney(); //参照
try{Thread.sleep(600);}catch(Exception e){} //ちょっと停止
tmp = tmp + 2000; //計算
bk.Deposit(tmp); //格納
}
とりあえず、スレッドAを200ミリ秒、Bを600ミリ秒停止で。結果↓ 1500正しくない結果。 Advertisement |
ショートカット・634・634ブログ ・このカテゴリのトップページに戻る ・Incubator(Pukiwiki) ・634ラボ UIコレクションギャラリー ZO-3ジェネレーター サイト検索Y!ログール |