gpt4 book ai didi

java - volatile 变量的工作

转载 作者:行者123 更新时间:2023-12-01 06:50:42 25 4
gpt4 key购买 nike

我正在尝试了解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com