2017-05-02 6 views
0

の必要性の説明:volatileキーワード:このプログラムでvolatileキーワードを理解し、このプログラムの動作

public class VolatileExample implements Runnable{  
private volatile int vol; 
@Override 
public void run(){ 
    vol=5; 
    while(vol==5) 
    { 
     System.out.println("Inside run when vol is 5. Thread is : "+Thread.currentThread().getName()); 
      if("t2".equals(Thread.currentThread().getName())) 
      { 
       System.out.println("Got Thread : "+Thread.currentThread().getName()+" Now Calling Stop To End This Flow"); 
       stopIt(); 
      } 
    } 
} 
public void stopIt(){ 
    vol=10; 
} 

public static void main(String[] args){ 
    VolatileExample ve1 = new VolatileExample(); 
    VolatileExample ve2 = new VolatileExample(); 

    Thread t1 = new Thread(ve1); 
    Thread t2 = new Thread(ve1); //t1 and t2 operate on same instance of VolatileExample class 

    t1.setName("t1"); 
    t2.setName("t2"); 

    t1.start(); 
    t2.start(); 
} 
} 

出力:

Inside run when vol is 5. Thread is : t1 
Inside run when vol is 5. Thread is : t1 
Inside run when vol is 5. Thread is : t2 
Inside run when vol is 5. Thread is : t1 
Got Thread : t2 Now Calling Stop To End This Flow 
Inside run when vol is 5. Thread is : t1 

すべてがすぐにメインメモリに書き込まれ、あるべき体積変数への書き込みすぐに他のスレッドに「可視」されます。 stopIt()が呼び出された後にt1スレッドがまだ実行されているのはなぜですか?それはvolの価値が今ではなく10であることがわかりますか?

+1

なぜあなたは 've2'を持っていますか?私たちやあなた自身を混乱させようとしていますか? – shmosel

+0

**告白**:私は混乱してしまった! – Batty

+0

私はve2を使ってプログラムの動作を以前チェックしていましたが、この例ではve1のみを使用しています –

答えて

3

stopIt()が呼び出された後に実行されるt1の証拠はありません。

物事はあなたが観察した結果を与える。このため

 t1      t2 
         System.out.println("calling stopIt()"); 
while(vol==5) 
System.out.println("Inside run") 
         enter stopIt() 
         vol = 10 

に起こることを可能にすることができます。 (あなたにこの結果を与える注文の他の可能性があります)

+0

または 'stop'()は' while'と 'println'の間で実行されます。 – shmosel

+0

@shmosel正確に(そしてそれは私が「注文の他の可能性」を意味していたものです):) –

+0

は理解されていますので、スレッドのスケジューリングに沸き、出力を予測できません。 –

関連する問題