質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Q&A

3回答

15471閲覧

マルチスレッドのテストについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

1グッド

2クリップ

投稿2016/01/20 09:54

Javaでマルチスレッドのプログラムを書いています。
しかしどのようにマルチスレッドのテストを書けばいいのかがよく理解できていません。

あるstatic変数countに複数のスレッドから読み込み、書き込みするようなプログラムを作成した場合、スレッドセーフ性を担保するようなテストはどのようなものになるでしょうか。

yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

どのようにマルチスレッドのテストを書けばいいのかがよく理解できていません。
スレッドセーフ性を担保するようなテストはどのようなものになるでしょうか。

ソフトウェアテストによるスレッドセーフ性の担保は、非常に困難もしくは事実上不可能と考えます。マルチスレッド・プログラムは本質的に非同期システムであり、あるテストが成功(PASS)したからといって「期待通り動くこともある」以上のことは何も言えません。まったく同じテストをもう一度実行したら、次回は失敗(FAIL)するかもしれませんし、運良く成功(PASS)するかもしれません。

もちろん、通常のシングルスレッド・プログラムであっても、ソフトウェアテストによる100%の信頼性保証は不可能であり、多数の試験ケースを用意することで「ソフトウェア品質の確からしさ」を担保しています。しかしマルチスレッド・プログラムの場合は複数スレッドの非決定的(=再現性のない)な相互作用が生じるため、起こりうる動作パターンが組み合わせ爆発を起こします。例えば10命令程度の2スレッド処理だけを考えた場合でも、起こりうる命令の実行順序並びを列挙すると、絶望的なパターン数になるはずです。

よそのQAサイトからの引用(英語)ですが、様々な意見も参考になるかと思います。
How should I unit test threaded code? - Stack Overflow

投稿2016/01/20 14:35

yohhoy

総合スコア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

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reizouko

2016/01/20 14:15

スレッドセーフなクラスに処理を委譲する事やリソースにアクセスするスレッドを限定するなどのテクニックは理解できるのですが、自分が作ったプログラムが本当にスレッドセーフか、誤った使い方をしていないかを発見できるのは、テストを作る時点では難しいですか??
guest

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

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ipadcaron

2016/01/20 15:05

ありゃ?下げが付いてる。だから、アトミックでしょう。interlocked 系の実装は足し算と代入の2命令のしょりの間割り込みが入らないことが保証されています。synchronized のようにがっつりロックせず、ほんの2命令実行するだけの間です。なんで、アトミック系の同期制御を使う限り読み込みは考えなくて良いのでづが、とほほ入門みてもどこらへんがどうなのかわかりませんでぢた。±1の増減値なら、interlocked が効率いいですよ、と。
gitiiii222

2016/02/27 04:49

質問の意味をまるで理解していない回答が目立つな
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問