2016-08-24 22 views
4

バイナリJavaコードで潜在的な並行性の問題を検討しています。コードには時々奇妙な振る舞いがありますが、実際にはコード自体の並行性の問題が原因であるのか、それとも他のものなのかどうかはわかりません。私は奇妙な振る舞いを自分で再現することはできませんでしたが、私たちのログファイルでそれが起こっているのを見ました。Linux上でJavaのコンテキストスイッチの頻度を調整する

潜在的な並行性の問題をより高い確率で浮上させるために、JVMのコンテキストスイッチ頻度を上げる方法はありますか?好ましくは、明示的にThread :: yeildまたはThread :: sleepへの呼び出しをコードに挿入することなく、これを実行します。

答えて

1

私はThread-weaverテストフレームワークがあなたを助けることができると思います。私はそれを実験してからしばらくしていますが、あなたが特定のスケジュールを強制することを許可しています。また、2つのメソッド間のインターリーブが多数テストされる、ある種のデフォルトモードで実行することもできます。

これは、(デフォルトのインターリービングを使用して)単純な例試験

public class MyListTest { 
    private MyList<String> list; 

    @Test 
    public void testThreading() { 
     AnnotatedTestRunner runner = new AnnotatedTestRunner(); 
     // Run all Weaver tests in this class, using MyList as the Class Under Test. 
     runner.runTests(this.getClass(), MyList.class); 
    } 

    @ThreadedBefore 
    public void before() { 
     list = new MyList<>(); 
    } 

    @ThreadedMain 
    public void mainThread() { 
     list.putIfAbsent("A"); 
    } 

    @ThreadedSecondary 
    public void secondThread() { 
     list.putIfAbsent("A"); 
    } 

    @ThreadedAfter 
    public void after() { 
     assertThat(list).hasSize(1); 
    } 
} 
あります
関連する問題