能否请您向我说明代码有什么问题:
问:即使我没有将闪烁信号灯声明为易失性,但线程t1仍能够看到主线程设置的更新值(真)…。
码:
package com.learning;
public class HowToStopRunningThread implements Runnable{
/**
* @param args
*/
public static boolean blinker;
public static void main(String[] args) {
Thread t = new Thread(new HowToStopRunningThread());
t.start();
HowToStopRunningThread obj = new HowToStopRunningThread();
obj.stop();
}
public void stop(){
try{
Thread.sleep(100);
System.out.println(“Setting the Blinker value”);
blinker = true;
}catch(InterruptedException ie){
ie.getMessage();
}
}
@Override
public void run() {
while(!blinker){
try{
System.out.println(“blinker:”+blinker);
Thread.sleep(1000);
}catch(InterruptedException ie){
ie.getMessage();
}
}
}
}
输出:
blinker:false
Setting the Blinker value
————————————
然后线程从while循环中出来
最佳答案
volatile保证新值将被其他线程可见。但这并不意味着对非易失性变量的更改将保证是不可见的。
简而言之,这是偶然发生的,并且不能保证在所有地方都可以正常工作。
在这种情况下,它肯定有效,因为两个线程都打印到System.out,而println是同步方法。同步还提供可见性保证。