@634

スレッドの実験 その5

Advertisement

共有データへのアクセス時の問題を回避する

今回は資源にロックをかける。ブロックを構築する方法と、メソッド自体にロックかける方法がある。

synchronizedブロック

コード
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(){

        //今回のポイント
        synchronized(bk){
            tmp = bk.RefMoney();  //参照
            try{Thread.sleep(200);}catch(Exception e){}
            tmp = tmp + 1000;     //計算
            bk.Deposit(tmp);      //格納
        }
    }
}

class ThreadB extends Thread{
    Bank bk;
    int tmp = 0;
    public ThreadB(Bank b){bk = b;}

    public void run(){
        synchronized(bk){
            tmp = bk.RefMoney();
            try{Thread.sleep(600);}catch(Exception e){}
            tmp = tmp + 2000;
            bk.Deposit(tmp);
        }
    }
}
synchronized(){}をつかった。synchronized()の引数としてオブジェクトを渡すと、そのブロックを抜けるまで渡したオブジェクトがロックされる。
3500

synchronizedメソッド

メソッド自体にロックをかける方法もある。
簡単に、例。
public synchronized int method(){
    〜 処理 〜
}
これで、このメソッドは複数のスレッドから同時に呼び出されることがなくなる。

Advertisement

ショートカット

634
634ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール