@634

スレッドの実験 その4

Advertisement

共有データへのアクセス時の問題点

複数のスレッドでひとつのデータを共有。
こうなるはず。↓

いっこのデータを複数のスレッドが参照。 → 各スレッドでデータ処理 → データ更新

整合性が維持できないはず。
実験。
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
このカテゴリのトップページに戻る
634labs
   UIコレクションギャラリー

サイト検索

Google

Web サイト内

Y!ログール