2017-10-06 18 views
-2

最近私のインタビューでは、私は混乱するマルチスレッドに関する質問を受けました。私の考えをクリアするために、私はこの質問をしています。Javaでスレッドを実行した後に出力可能

質問は

public class SampleThread implements Runnable { 
static int x = 4; 

public void run() { 
    x++; 
    System.out.println(x); 
} 
} 

今すぐ実行可能なそれを有する3スレッドのインスタンスがあると言うことができます「次のコードのために私に7 6 5または7 5 6のような出力を与えることができ、実行のいずれかの可能なシナリオがあります」でした次のようにターゲットオブジェクトとしてインスタンスを作成します。

public class Test { 

public static void main(String[] args) { 

    SampleThread s1=new SampleThread(); 

    Thread t1=new Thread(s1); 
    Thread t2=new Thread(s1); 
    Thread t3=new Thread(s1); 

    t1.start(); 
    t2.start(); 
    t3.start(); 
}} 
+0

この質問は、私は明確な質問の説明を与えているし、スレッドを理解することは非常に便利である否決されたのはなぜconcept.So代わりにダウン投票の正しい答えを与えてみてください。.. 。 – user7324139

答えて

0

はい、スレッドは順番に並行して実行されています。

どのような種類の同期も行わずにシェア変数を書き込んで読み込むので、メモリの整合性エラーが発生する可能性があります。この場合、確実に言うことができるのは、各スレッドの印刷操作の前にインクリメントが発生することです(他のスレッドが読み書きしている可能性があるため、直前ではありません)。値を同時に読み取るスレッド、古い値に基づいて変更を行うスレッド、別のスレッドを変更した後に読み取るスレッドの値は、765や766などの出力につながる状況です。

並行性とメモリー一貫性は、それは非常に詳細です:? https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility

関連する問題