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

标签 java multithreading volatile

我有两个线程同时更新一个共享的int。大多数时候,此代码将打印 01。但有时,它会打印 00(一次更新失败)。如果我将 int 值设置为 volatile,是否会一劳永逸地修复更新失败?

这真的不是家庭作业问题。我只是写了这些代码和这个问题,好像是为了澄清我对 Java 内存模型的理解。我读了this Article .

我知道这段代码将以同步的方式修复,但这不是问题的范围,只是关于 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?

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

关于java - volatile 会修复这个多线程代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30066407/

相关文章:

c++ - 带有 Visual Studio 2005 的 volatile unsigned __int64 行为异常

CUDA volatile 和 threadfence

java - CDI部署失败:WELD-001414 Bean name is ambiguous

java - Servlet 在调用时不显示任何内容

java - 在现有代码上实现线程

java - 同步作为 volatile 声明的替代方案

java - Camel : keep a file to folder depended on response

java - 为什么相机的实时预览旋转90度?

c# - 在 .NET 中使用 volatile 进行线程间的单向通信

c++ - 调试期间没有错误,但在正常执行期间出错