我有两个线程同时更新共享int
。大多数情况下,此代码会打印0
和1
。但有时候,它会打印0
和0
(一次更新失败)。如果我制作了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();
}
}
答案 0 :(得分:3)
如果我将int值设置为volatile,那么修复该更新是否会失败,一劳永逸?
没有。您看到的问题几乎肯定与内存不一致无关。失败是因为原子性。众所周知,++
运算符不是原子的(实际上是三个运算)。您可以阅读有关它的大量信息。
答案 1 :(得分:0)
感谢John澄清同样的事情......
执行System.out.println(Testes.value ++)时会发生什么 它是一个增量的后缀操作...所以println完成了 首先然后值增加...这就是为什么你看到0 by 第一个线程..但是在println完成后执行它 该值现在为1 ..这就是为什么第二个线程显示1时的原因 它会打印出值......