Jtest -Java対応自動テストツール-
今月のピックアップ
Parasoft Jtest 8.4 技術資料
「マルチスレッドプログラミング」
デッドロックの可能性
つぎのプログラムを見てみましょう。
例 1 デッドロックの可能性
クラスUSLでは インスタンスメソッドであるupdateOnceが synchronized として宣言されています。これは変数countをプロテクトするためです。インスタンスメソッドupdateTwice内では synchronizedブロックで、オブジェクトLOCKを使用してcount変数をプロテクトしています。
この場合は、前者はThisインスタンス上にロックを取り、後者はLOCKインスタンス上にロックを取ることを表しています。
この場合は、前者はThisインスタンス上にロックを取り、後者はLOCKインスタンス上にロックを取ることを表しています。
Jtest 8.4 ではこのプログラムに対してつぎのような違反を検出します。
図 1 Jtest によるデッドロックの可能性の指摘
同じ変数を異なるロックでプロテクトしようとすると、複数のスレッドがアクセスした場合にタイミングによってデッドロックになる可能性があります。
この場合、つぎのようにいずれも synchronizedなインスタンスメソッドとして定義するほうが自然です。そうすれば、USLインスタンス上に同一のロックオブジェクトを使用してcount変数をプロテクトすることができます。
この場合、つぎのようにいずれも synchronizedなインスタンスメソッドとして定義するほうが自然です。そうすれば、USLインスタンス上に同一のロックオブジェクトを使用してcount変数をプロテクトすることができます。
○修正例
例 2 修正した例1のプログラム
レース・コンディション
レース・コンディションの例として、『今月のピックアップ』2008年12月バックナンバーで紹介していますので、こちらもご参照ください。この記事では、Webアプリケーションにおけるfinalでないstatic変数を、複数スレッドで同時アクセスした場合に生じる問題を扱っています。











