スレッドの実験 その5Advertisement共有データへのアクセス時の問題を回避する
今回は資源にロックをかける。ブロックを構築する方法と、メソッド自体にロックかける方法がある。
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・このカテゴリのトップページに戻る ・634labs UIコレクションギャラリー サイト検索Y!ログール |