Javaでマルチスレッドのプログラムを書いています。
しかしどのようにマルチスレッドのテストを書けばいいのかがよく理解できていません。
あるstatic変数countに複数のスレッドから読み込み、書き込みするようなプログラムを作成した場合、スレッドセーフ性を担保するようなテストはどのようなものになるでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
どのようにマルチスレッドのテストを書けばいいのかがよく理解できていません。
スレッドセーフ性を担保するようなテストはどのようなものになるでしょうか。
ソフトウェアテストによるスレッドセーフ性の担保は、非常に困難もしくは事実上不可能と考えます。マルチスレッド・プログラムは本質的に非同期システムであり、あるテストが成功(PASS)したからといって「期待通り動くこともある」以上のことは何も言えません。まったく同じテストをもう一度実行したら、次回は失敗(FAIL)するかもしれませんし、運良く成功(PASS)するかもしれません。
もちろん、通常のシングルスレッド・プログラムであっても、ソフトウェアテストによる100%の信頼性保証は不可能であり、多数の試験ケースを用意することで「ソフトウェア品質の確からしさ」を担保しています。しかしマルチスレッド・プログラムの場合は複数スレッドの非決定的(=再現性のない)な相互作用が生じるため、起こりうる動作パターンが組み合わせ爆発を起こします。例えば10命令程度の2スレッド処理だけを考えた場合でも、起こりうる命令の実行順序並びを列挙すると、絶望的なパターン数になるはずです。
よそのQAサイトからの引用(英語)ですが、様々な意見も参考になるかと思います。
How should I unit test threaded code? - Stack Overflow
投稿2016/01/20 14:35
総合スコア6191
0
読み込みの際にもスレッドの同期が関係してきます→参考:とほほのJava入門
複数のスレッドから読み込み・書き込みを正常に行うのであれば、アクセッサを用意してそれにsynchronized修飾子を付ける必要があるかと思います。
java
1class Counter{ 2 private static int count = 0; 3 4 synchronized public static int getCount(){ 5 return count; 6 } 7 8 synchronized public static void setCount(int newCount){ 9 count = newCount; 10 } 11 12}
投稿2016/01/20 13:57
総合スコア20669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
読み込みだけならスレッド関係ないですよ。
問題になるのは書き込みです。
http://stackoverflow.com/questions/1152298/whats-javas-equivalent-of-nets-interlocked-class
https://docs.oracle.com/javase/jp/6/api/java/util/concurrent/atomic/AtomicInteger.html
ここらへんが参考になります。
.net 用語で、interlocked
java だと concurrent.atomic あたりがマルチスレッドで安全に変数を更新する仕掛けを実装したクラスです。
投稿2016/01/20 10:03
総合スコア1693
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/20 15:05
2016/02/27 04:49
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。