2017-09-02 8 views
2
@State 
@JCStressTest 
public class M { 
    class A { 
     int f; 
     A() { 
      f = 42; 
     } 
    } 
    private A a; 

    @Actor 
    void actor1(){ 
     a = new A(); 
    } 
    @Actor 
    void actor2(IntResult1 r){ 
     r.r1 = 1; 
     if(a != null){ 
      r.r1 = a.f; 
     } 
    } 
} 

私はjcstressでテストしましたが、出力は0になりません。私はその出力を見なければならないことは明らかではないが、それは可能であり、私はそれを見たいと思う。どのようなJVMオプション(XX:....など)がありますか?データ競争と安全な発行

答えて

2

私はその出力を見なければならないことは明らかではありませんが、それは可能であり、私はそれを見たいと思います。

コードにデータ競争があることは間違いありません。 (常に値42が表示されますa.fという保証はありませんは起こりません-前f = 42とJMMに定める規則に基づく推論... = a.fチェーンがありますので、それがされています。)

しかし、このレースの性質は、非常にまれなシナリオでのみ発生するようなものです。たぶん間違った瞬間に、複数のコアを持つシステムと、高メモリ負荷か不随意のスレッドコンテキスト切り替えのどちらかが必要になります。そして、それはJITコンパイラによって放出されたネイティブコードに依存するでしょう。

強制するJVMオプション(XX:....など)はありますか?

残念ながら、ありません。


1 - バイトコードからサウンドの推論を引き出すことはできません。 JITコンパイラはで、JMMルールに違反していない限り、メモリの読み書きを含む命令の順序を変更することができます。(JLS/JVMSによる)。これは、マルチスレッドコードのパフォーマンスにとって重要です。

関連する問題