Java易失性变量

时间:2014-07-03 13:49:53

标签: java volatile

我试图通过以下示例了解易失性用法。我希望它先打印10秒然后再打印15秒。但大部分时间我都会得到10分和10分。 下面的代码本身就是一些东西。

class T implements Runnable {

    private volatile int x = 10;

    @Override
    public void run() {
        if(x==10) {
            System.out.println(x);
            x = x+ 5;
        } else if(x==15) {
            System.out.println(x);
        }
    }
}


public class Prep {

    public static void main(String [] args) {
        T t1 = new T();
        new Thread(t1).start();
        new Thread(t1).start();
    }
}

2 个答案:

答案 0 :(得分:7)

你只有一个竞争条件:两个线程并行运行,因此你有(例如)

  • 线程1测试x == 10(真)
  • 线程2测试x == 10(真)
  • 主题1打印10
  • 线程2打印10
  • ...

x在这里是不稳定的这一事实是无关紧要的。在此示例中,volatile唯一保证的是如果线程1在线程2读取其值时已经递增x,则线程2将看到递增的值。但这并不意味着两个线程不能并行运行,如上所示。

答案 1 :(得分:0)

这将有效:

public static void main(String[] args) {
        T t1 = new T();
        new Thread(t1).start();
        try {
            Thread.currentThread().sleep(1000); // sleeping for sometime .
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        new Thread(t1).start();
    }

answer : 10 15

原因:操作

if(x==10) {
            System.out.println(x);

可能首先执行第一个线程,然后上下文将切换回Thread2(竞争条件,因为JB Nizet解释..)所以当两个线程都打印x的值时,它仍然是10. / p>