volatile会修复这个多线程代码吗?

时间:2015-05-06 02:25:04

标签: java multithreading volatile

我有两个线程同时更新共享int。大多数情况下,此代码会打印01。但有时候,它会打印00(一次更新失败)。如果我制作了int value volatile,那么修复该更新会失败,一劳永逸吗?

这不是一个家庭工作的问题,真的。我刚刚编写了这些代码和这个问题,就像是,以澄清我对Java内存模型的理解。我看了this Article

我知道这段代码将以synchronized的方式修复,但这不是问题的范围,只是关于volatile修复与否,以及为什么。

    public class Testes{

    public static int value = 0;

    public static void main(String ... args) {

        T t = new T();
        T t2 = new T();

        t.start();
        t2.start();

    }

}

class T extends Thread{

    public void update(){
        System.out.println(Testes.value++);
    }

    public void run(){
        this.update();
    }

}

2 个答案:

答案 0 :(得分:3)

  

如果我将int值设置为volatile,那么修复该更新是否会失败,一劳永逸?

没有。您看到的问题几乎肯定与内存不一致无关。失败是因为原子性。众所周知,++运算符不是原子的(实际上是三个运算)。您可以阅读有关它的大量信息。

答案 1 :(得分:0)

感谢John澄清同样的事情......

执行System.out.println(Testes.value ++)时会发生什么 它是一个增量的后缀操作...所以println完成了 首先然后值增加...这就是为什么你看到0 by 第一个线程..但是在println完成后执行它 该值现在为1 ..这就是为什么第二个线程显示1时的原因 它会打印出值......