Java
Java
Java2 SE 5.0 API
Java2 SE 1.4 API
Java2 EE API
Struts 1.0.2
MSDN2 Library
MySQL 5.1
MySQL 4.1
HTMLリファレンス
CSSリファレンス
JavaScript
基本カラーチャート
カレンダー
 最新PG・講座情報
 最新ニュース
 電子辞書・辞典
ご意見・ご要望はこちらまで

連載

Java

スレッドの同期


1.プログラムの仕様

 今回はスレッド処理での落とし穴と言われる「スレッドの同期」部分の確認を、よく使われる銀行の共有口座を例として説明します。 同期の説明は問題となるエラーを確認後にしますので、まず先に問題を起こすプログラムを作成してみます。
 処理はアプレットとし、次のような仕様にします。

  • 共有口座(Account)には残高(blance)データがあり、それに対する残高照会(getBalance)と入金処理(setBalance)のメソッドを持ちます。 入金処理は残高(blance)の更新処理となります。

  • 5名の顧客(Customer)が銀行の共有口座に一定額の入金をします。

  • 5名の顧客が同時平行に入金を行えるように入金処理をスレッド処理にします。

  • 顧客からの入金額は10万円とします。(最終残高は50万円)
    但し、1回の入金では問題の同期に対するエラーが出る確率が低くなるので(殆ど0%)、小刻みに1円ずつ10万回に分けて入金するようにします。

  • アプレットでは初期処理(init)で5名の顧客が一斉に入金を開始し、全ての入金が完了後、残高を表示します。
    但し、アプレットの機能は共有口座(Account)内に記述することにします。

銀行口座の残高の照会と入金の流れ
 

2.スレッドの完了待機

 今回のスレッド処理は顧客の入金処理ですから、顧客クラス(Threadクラスを継承)上にあるrun()メソッドが入金処理になります。 5名分のスレッド処理を開始するのは、Threadクラスのstart()メソッドを5回実行することになりますが、 その後でアプレット上に残高を表示する記述をしても、メソッドの実行順序には関係せず最初の方で表示されてしまいます。
 これを防ぐためにThreadクラスのjoin()メソッドがあり、実行後に各スレッド処理の完了を待ってから次の処理へ行くことを保障してくれます。

join()メソッドでスレッドの完了待機
 

 
 INDEX
  連載 Java スレッドの同期
1.プログラムの仕様
  2.プログラムの説明
  3.確認テスト(1)と修正
  4.確認テスト(2)
Top
Copyright© 2003-2007 FumikiChan All Rights Reserved.
http://www.fumikichan.net/