volatile 会修复这个多线程代码吗?
Will volatile fix this Multi-Thread Code?
我有两个线程同时更新共享 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();
}
}
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 ..这就是为什么第二个线程在
它打印值....
我有两个线程同时更新共享 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();
}
}
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 ..这就是为什么第二个线程在 它打印值....