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

Will volatile fix this Multi-Thread Code?

我有两个线程同时更新共享 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();
    }

}

If I make the int value volatile, will fix that update fail, once for all?

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

感谢 John 的澄清...

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