我有两个线程同时更新一个共享的int
。大多数时候,此代码将打印 0
和 1
。但有时,它会打印 0
和 0
(一次更新失败)。如果我将 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/