如何理解截图中说的
该变量不会与其他状态变量一起纳入不变性条件什么叫不变性条件谁能构建一个例子说明一下这个场景下使用volatile会发生什么错误

解决方案 »

  1.   

    volitile的含义就是被修饰的变量是可变的,所以这个修饰不能和final一起用的原因。而这个可变性暗示着变量发生变化可以被多个使用该变量的线程感知。这样在很多时候可以降低线程同步的代价。
    这个举例子不太好用:
    public class VolatileApplication {
    public static void main(String[] args) throws Exception { MyRunnable r = new MyRunnable();
    Thread t = new Thread(r);
    t.start();
    r.setEnd(true);//line 9
    t.join();//line 10
    System.out.println("Terminate the main Thread.");//line 11
    }}class MyRunnable implements Runnable {
    private boolean end = false;//line 17 @Override
    public void run() {
    while (!end) {// line 22
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    }
    System.out.println(Thread.currentThread() + " is going on!");
    }
    } public void setEnd(boolean end) {
    this.end = end; //line 32
    }
    }
    以上代码启动了一个任务MyRunnable,line 22是这个线程的终止条件,这个任务提供了一个修改终止条件的方法setEnd(boolean end),这个任务将会运行在一个新线程中,line 9主线程调用了修改方法;用来修改循环的终结条件,但是如果不使用volatile关键字的话,那么这个设置有可能不被运行run方法的线程发现,这个发现过程是需要线程在主存中得到,如果主存没有被刷新那么这个就将导致设置效果出问题。volatile就是强制将改变刷新到主存,保证了线程通信的可靠性。
    运行以上代码,基本是没有问题的,因为在这样一个示例系统中,很难导致问题出现,这个问题出现的概率一般极小,但是一旦发生就可能引发灾难性的后果。