我正在尝试了解 volatile 变量的工作原理。我创建了一个简单的类“A”,它扩展“Thread”并具有一个 volatile 变量“i”。还有另一个类“Amain”运行“A”类的 3 个线程。我正在 A 的 run() 内部运行一个循环,它依赖于这个 volatile 变量。这是代码。
// Thread
public class A extends Thread {
public volatile int i = 0;
@Override
public void run() {
while(i<10)
System.out.println(i++ + " " + this.getName());
}
}
// Main Class
public class Amain {
public static void main(String[] args) {
A t1 = new A();
A t2 = new A();
A t3 = new A();
t1.start();
t2.start();
t3.start();
}
}
如果 volatile 值在所有线程之间共享,那么“i”应该被打印 10 次。相反,它为每个线程打印 10 个值,即总共 30 个值。需要了解这段代码上下文中 volatile 的工作原理。另外,我该怎么做才能从任意数量的线程中仅获取 10 个 i 值(在此代码的上下文中)。
最佳答案
在您的情况下,您创建了三个单独的 A
对象,每个对象都有其单独的 i
字段,因此这里没有共享状态。如果您希望共享变量,请将其声明为static
:
public static volatile int i = 0;
请注意,即使变量是 volatile 的,递增它仍然是不安全的。使用AtomicInteger
相反。
关于java - volatile 变量的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30318493/