Jtest -Java対応自動テストツール-
今月のピックアップ
Parasoft Jtest 8.4 技術資料
「マルチスレッドプログラミング」
Thread Safe Programming ルールセット
| カテゴリ | ルール |
| ガーベッジ コレクション [GC] | 際限なく大きくなる可能性のある static なコレクションまたはマップを避ける [GC.STV-3] |
| 初期化 [INIT] | 遅延初期化のための "if" チェックでは適切な演算子を使用する [INIT.AULI-3] |
| 最適化 [OPT] | 1 つのメソッド内でだけアクセスされる private フィールドを使用しない。ローカル変数に変更する [OPT.CTLV-3] |
| 配列のコピーには、ループではなく System.arraycopy () を使用する [OPT.IRB-2] | |
| ローカル変数には同期データ構造を使用しない [OPT.SDLS-3] | |
| ループ本体で synchronized メソッドを呼び出さない [OPT.SYN-3] | |
| API の使用と実装 [PB.API] | "Collections" または "Maps" で "URL" オブジェクトを使用しない [PB.API.IUMS-1] |
| ガーベッジ コレクション [GC] | 際限なく大きくなる可能性のある static なコレクションまたはマップを避ける [GC.STV-3] |
| 紛らわしいまたは意図的でない振る舞い [PB.CUB] | for ループの内部でループ制御変数に代入しない [PB.CUB.FLVA-2] |
| 論理エラー [PB.LOGIC] | 無限ループを使用しない [PB.LOGIC.AIL-1] |
| 配列または List 要素へアクセスするのに誤った添え字変数を使用しない [PB.LOGIC.AMOI-4] | |
| ループの条件で使用されないループ変数を避ける [PB.LOGIC.AULV-1] | |
| 読み込みまたはスキップを行うメソッドの戻り値を確認する [PB.LOGIC.CRRV-1] | |
| 戻り値が null ではないことをチェックした後に readLine() の結果を破棄してはいけない [PB.LOGIC.DJNCR-1] | |
| 無限の再帰呼び出しを行わない [PB.LOGIC.FLRC-1] | |
| ループ変数の使用でのバグを防止する [PB.LOGIC.INDEX-2] | |
| ネストされた複数の for ループにおいて同じループ変数をインクリメント/デクリメントしてはいけない [PB.LOGIC.JI-1] | |
| ループの条件で使用されるオブジェクトは適切にループ本体でアクセスされるようにする [PB.LOGIC.OAMC-2] | |
| 実行時例外 [PB.RE] | 必要な場合 'indexOf()' の "fromIndex" 引数を使用する [PB.RE.IOSS-2] |
| 実行時例外 [PB.RE] | 必要な場合 'indexOf()' の "fromIndex" 引数を使用する [PB.RE.IOSS-2] |
| タイプ ミス [PB.TYPO] | 条件内で代入演算子を使用しない [PB.TYPO.ASI-1] |
| switch 文の case のフォールスルーで同じ変数に代入してはならない [PB.TYPO.DAV-3] | |
| 不要なコード [PB.USC] | 到達しない "else if" と "else" を避ける [PB.USC.UIF-1] |
| シリアライゼーション [SERIAL] | readObject() メソッドを synchronized として宣言してはいけない [SERIAL.SROS-3] |
| サーブレット [SERVLET] | Servlet クラスでインスタンス フィールドを定義してはいけない [SERVLET.IF-3] |
| サーブレット内の同期化を最小限にする [SERVLET.SYN-2] | |
| スレッドと同期化 [TRS] | Servlet クラスでインスタンス フィールドを定義してはいけない [SERVLET.IF-3] |
| 常に同期化された方法でアクセスされる Atomic 変数を使用しない [TRS.AIL-4] | |
| すべての待ちスレッドに通知されるように notify () ではなく notifyAll () を使用する [TRS.ANF-3] | |
| 常に同期化された方法でアクセスされる Atomic 変数を使用しない [TRS.AIL-4] | |
| Thread.interrupted() を誤って使用しない [TRS.ATI-3] | |
| 安全ではない java.lang.ThreadGroup 型の変数を使用しない [TRS.AUTG-3] | |
| VM によって異なる振る舞いをするかもしれないため Thread.yield () を使用しない [TRS.AUTY-3] | |
| 静的な java.text.DateFormat および java.util.Calendar を使用してメソッドを呼び出してはならない [TRS.CDF-3] | |
| 可能な限り Hashtable および synchronizedMap でラップされた HashMap の代わりに ConcurrentHashMap を使用する [TRS.CHM-5] | |
| Thread を拡張するクラス以外で InterruptedException をキャッチしない [TRS.CIET-4] | |
| 同期化されたコレクションに対する複合アクションによるアクセスは原子性に違反するため避ける [TRS.CMA-3] | |
| デッドロック発生の原因となる synchronized メソッドからの synchronized メソッドの呼び出しを避ける [TRS.CSFS-3] | |
| コンストラクタからスレッドの start メソッドを呼び出さない [TRS.CSTART-3] | |
| コンストラクタで this 参照を流出させない [TRS.CTRE-3] | |
| 安全ではない "ダブルチェック ロッキング" パターンの実装を避ける [TRS.DCL-3] | |
| PriorityBlockingQueue で DiscardOldestPolicy を使用しない [TRS.DOPQ-3] | |
| デバッグ目的の場合を除いて、getState を使用しない [TRS.GSD-4] | |
| 同期化が必要な可能性のある static フィールドへのアクセスを検査する [TRS.IASF-2] | |
| スレッドセーフな怠惰な初期化にする [TRS.ILI-4] | |
| 設計上の欠陥を示す可能性があるため IllegalMonitorStateException をキャッチしてはいけない [TRS.IMSE-3] | |
| java.lang.Thread を拡張するクラスまたは java.lang.Runnable を実装するクラスで run() を直接呼び出さない [TRS.IRUN-3] | |
| 関連のある複数の Atomic 変数には synchronized ブロック内でアクセスする [TRS.MRAV-4] | |
| 別のスレッドして実行できるようにスレッドのサブクラスには run () を入れる [TRS.MRUN-2] | |
| スレッドに必ず名前を付ける [TRS.NAME-3] | |
| synchronized でないメソッドで wait ()、notify ()、notifyAll() を呼び出さない[TRS.NSYN-2] | |
| finally ブロックでロックを解放する [TRS.RLF-2] | |
| Runnable.run() を実装するメソッドで同期化を使用する [TRS.RUN-5] | |
| 定数 String を同期化しない [TRS.SCS-1] | |
| static の synchronized メソッドと static でない synchronized メソッドを混合させない [TRS.SNSM-4] | |
| java.util.concurrent.locks.Lock の実装に "synchronized" キーワードを使用して同期化を実行してはいけない [TRS.SOL-3] | |
| デッドロックを引き起こす可能性があるため、public フィールドを同期化しない [TRS.SOPF-2] | |
| 相互排除の保証が難しくなるため final ではないフィールドを同期化してはいけない [TRS.SOUF-3] | |
| set メソッドを同期化している場合、get メソッドも同期化する [TRS.SSUG-3] | |
| Object の this 参照で同期化を実行したりセマフォ メソッドを呼び出したりしてはいけない [TRS.STR-3] | |
| 安全ではない非推奨のメソッド Thread および Runtime を呼び出さない [TRS.THRD-1] | |
| ロックを保持している間に Thread.sleep() を呼び出さない。さもないとパフォーマンスを劣化させたりデッドロックを引き起こしたりする [TRS.TSHL-2] | |
| Collections.synchronized でラップされた Collection の同期化されていないアクセスを避ける [TRS.UACS-3] | |
| 安全な場合にだけ同期化されていない Collection または Map を使用する [TRS.UCM-3] | |
| 同一のロック オブジェクトを使用して変数にアクセスする [TRS.USL-2] | |
| run() メソッドを指定せずにスレッドを開始してはならない [TRS.UT-2] | |
| liveness 状態をテストするループの内部でだけ wait () と await() を呼び出す [TRS.UWIL-1] | |
| ポーリング ループではなく wait () および notifyAll () を使用する [TRS.UWNA-2] | |
| "java.util.concurrent.locks.Condition" オブジェクトで正しいメソッド呼び出しを使用する [TRS.WOC-3] | |
| 他のメソッドが同期化されていない場合、writeObject() メソッドを同期化してはいけない [TRS.WOS-4] | |
| 未使用コード [UC] | 空の synchronized 文を避ける [UC.SNE-1] |
| その他 [MISC] | あまり多くの 非final なstatic フィールドを使用しない [MISC.MSF-4] |
参考文献
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
結城浩 著 ソフトバンククリエイティブ刊 (ISBN4-7973-3162-3)











