1. Top » 
  2. スポンサー広告 » 
  3. Javaでマルチスレッド 四行目
  4. プログラミング全般 » 
  5. Java » 
  6. Javaでマルチスレッド 四行目

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Genre:

Javaでマルチスレッド 四行目

定番の例として、銀行のお金を扱ってみる。
参考書は引き続き、結城浩氏の「改訂版 Java言語プログラミングレッスン下」です。

悪い銀行



public class BadBank{
  private int value = 0;
  public void addMoney(int money){
    //現金残高の保存
    int currentValue = value;
    //状況を表示
    System.out.println(Thread.currentThread() + "がaddMoneyに入りました");
    //現在残高を変更
    value += money;
    //矛盾がないかどうかチェック
    if(currentValue + money != value){
      System.out.println(Thread.currentThread() + "で矛盾が発生");
      System.exit(-1);
    }
    //状況を表示
    System.out.println(Thread.currentThread() + "がaddMoneyから出ました");
  }
}




悪い銀行を使う



public class BadBankTest extends Thread{
  BadBank bank;
  public BadBankTest(BadBank bank){
    this.bank = bank;
  }
  public void run(){
    while(true){
      bank.addMoney(100);
      bank.addMoney(-100);
    }
  }
  public static void main(String[] args){
    BadBank bank = new BadBank();
    new BadBankTest(bank).start();
    new BadBankTest(bank).start();
  }
}



利用例では、自分自身をThreadのサブクラスにしています。
インスタンスを設定してStartでThreadを生成する方式です。


今回の例、必ず矛盾が起きて止まります。
なぜなら二つのスレッドの切り替えのタイミングが問題になるからです。


 1.1つ目のスレッドで残高を保存して表示(0円)
<Thread切り替え>
 2.2つ目のスレッドで残高を保存して表示(0円)
<Thread切り替え>
 3.1つ目のスレッドがvalueにmoneyを足す(value=100)
 4.1つ目のスレッドで矛盾チェック(0+100=100)・・・OK→出力
<Thread切り替え>
 5.2つ目のスレッドで矛盾チェック(100+100!=100)・・・NG→出力
 6.矛盾発生して終了



これはインスタンス変数がインスタンスに1つしかないことから発生します。
お互いが同じ変数を参照するのはいいにしても
それを書き換え始めると、非常に危険なことが起きるわけです。
つまり、その時読み込んでいるデータが今の最新データとは限らない
又は自分が読み出した後に書き込まれてしまうと整合性が崩れます

これを解決するには、マジックワード「synchronized」です。
また次回。
関連記事
スポンサーサイト

Comment

コメントフォーム
このエントリへコメントを書く
(任意)
(任意)
(任意)
(必須) HTMLタグは使用できません
(任意) ID生成と編集に使用します
(任意) 非公開コメントにする

Page Top

Trackback

Trackback URI
http://parabola0.blog86.fc2.com/tb.php/84-e5ce2bc9 この記事にトラックバックする(FC2ブログユーザーのみ)

Page Top

訪問者

お引っこし。 http://parabola.sblog.jp/

プロフィール

parabola0

Author:parabola0
Twitter用ですが…。
プロフィール

最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
リンク

このブログをリンクに追加する

QRコード
QRコード
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。