の必要性の説明: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であることがわかりますか?
なぜあなたは 've2'を持っていますか?私たちやあなた自身を混乱させようとしていますか? – shmosel
**告白**:私は混乱してしまった! – Batty
私はve2を使ってプログラムの動作を以前チェックしていましたが、この例ではve1のみを使用しています –