【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

下記のサンプルソースは、デッドロックを起こすソース
なのですが、
public class Deadlock extends Thread {
public static Object l1 = new Object();
public static Object l2 = new Object();
private int index;
public static void main(String[] a) {
Thread t1 = new ThreadA();
Thread t2 = new ThreadB();
t1.start();
t2.start();
}

private static class ThreadA extends Thread {
public void run() {
synchronized (l1) {
System.out.println("スレッド1: l1に対するロックを取得");
try { Thread.sleep(10); }
catch (InterruptedException e) {}
System.out.println("スレッド1: l2のロックの開放待ち");
synchronized (l2) {
System.out.println("スレッド1: l1、l2に対するロックを取得");
}
}
}
}

private static class ThreadB extends Thread {
文字数オーばーのため削除
}



これを参考に、Junitでデッドロックを起こすサンプルを作りたいです。
MultithreadedTestCaseと
ControllableTestThreadを使い
サンプルを作りたいのですが、
英語が良くわからず苦戦しております。
なにか、よいアドバイスをいただけませんでしょうか?
よろしくお願いします

A 回答 (1件)

まずは確認ですが、↓のサイトにあるクラスでいいですか?


MultithreadedTestCaseの方はいくつか引っかかるので…
http://www.mousepushers.com/java/mtjunit/doc/com …

ここにあるサンプルコードを見る限り、
1.ThreadA、ThreadBの親クラスをControllableTestThreadにする
4.ThreadAとThreadBのrunメソッドの中身を、testOKに移動
2.自分が作成するテストケースクラス(Deadlockクラス)は、MultithreadedTestCaseをextendsし、test~にサンプルコードを記述
3.サンプルコードにある、new TestThread~~を、ThreadAとThreadBに変更
5.ThreadA、ThreadBは、テストの実行結果をtestOk()メソッドの中で判定し、true/falseで返却

で移植そのものは終了です。
ただし、問題点は何を持って失敗/成功とするかですね。
デッドロックを起こすわけですから、ThreadA、ThreadBは停止してしまいますし…
testOKメソッドの最後でフィールドに用意したフラグを必ずtrueにするようにしておいて、
そのフラグがfalseのままだったらまだ通過してないのでOKとかですかね。
getFailures()はこの場合使わないです。
    • good
    • 0
この回答へのお礼

deadlockさん。
ありがとうございます(^-^)/
返事が遅くなりまして、すみませんでした。

ご指摘のとおりのサイトです。

移植の方法を詳しく教えていただき
ありがとうございます。


でも、ご指摘のとおり、
何を持って失敗/成功とするかですよね。
Junitでデッドロックを起こすサンプルを作って
デッドロックが発生したという検証を行いたかったのですが・・・

自分が意図していたものが
こちらのクラスで実現できるのか。。。

自分の目的がイマイチはっきりしていないなか、
丁寧に回答していただき本当にありがとう
ございます。

実際に、移植してみて
どのような動きをするか
検証をしてみます。

今回は、ありがとうございました。(^-^)/

お礼日時:2005/08/22 10:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報