Java PathFinder を使った Thread の検証

Menu

複数のJava の Thread が共有している文字列 String を調べて、Thread の実行の様子を調べよう。

interleave の例題 interleave の例題 (tgz) これを展開して、

    ant run

で実行してみる。(Eclipse からでも良い)

何回か実行して見て、動作が異なるかどうかを調べよう。


PathFinder による実行

Java PathFinder
    http://javapathfinder.sourceforge.net/

をinstallして実行しよう。(naha:/net/open を共有して、
    /Volume/naha.ie.u-ryukyu.ac.jp/JAVA/jpf/bin/jpf

で実行しても良い。)

文字列の結合の結果がさまざまになるはずである。これは、Thread がinterleaving (混ぜこぜ)に実行されることを示している。PathFinder はすべての可能な結果を示している。

Thread を三つに増やした場合は、どんな文字列が生成されるか。実際に PathFinderを動作させて、生成された文字列と比較してみよ。

jpf のscript は、

    JPF_HOME=/Users/kono/src/public/jpf-core

と言うように、絶対パスで JPF_HOME を指定する方が便利。

 jpf +classpath=. threadTest.TestThread 

というように実行します。threadTest/TestThread.java をcompileしたthreadTest/TestThread.class がないとだめ。


synchornization がない場合

Thread が二つの場合、interleave の例題の synchronized を取って、生成される文字列をすべて示せ。

work() メソッドが直列可能でない実行している場合の文字列を一つ示し、それが、どのような実行によって、生成されたかを UML のシーケンス図で記述せよ。


assert

この場合のwork() メソッドが直列可能である条件を Java のassert を用いて記述し、Thread が三つの場合に、

    (1) synchronized を付けた場合に、assert が valid であること
    (2) synchronized がない場合に、assert の否定が satisfiable であること

を PathFinder によって確認した結果を示せ。


Shinji KONO / Tue Jan 11 14:10:24 2011