gpt4 book ai didi

java - 在匿名线程中使用最终变量

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:00 25 4
gpt4 key购买 nike

做这样的事情安全吗

for (int i = 0; i < 10; i++){
final int finalI = i;
new Thread(() -> {
// use finalI in the thread somehow
});
}

所以我想问的问题是,是否保证线程0..9会看到finalI分别为0..9?

例如,如果在第二次迭代中 FinalI 发生更改并且第一个线程看到 FinalI 为 1 而不是 0,会发生什么情况。

我有 99% 的感觉这是不可能的,但我不知道匿名类如何存储变量,所以我不是 100% 确定。

如果匿名类要引用该变量的外部引用,那么那将是错误的,但它并不是真正的引用,因为它是一个原语。那么线程匿名类到底如何存储变量呢?

在幕后,JVM 是否会在匿名线程中提供一个私有(private) Final int FinalI 字段,然后隐式将其设置在构造函数中?

最佳答案

最终我将分别看到0..9。

要了解内部发生的情况,让我们看看将变量声明为

final

是的。

让我们来看看

public class ThreadTest {

public static void main(String[] args) {
for(int i =0; i< 9; i++) {
final int finalI = i;
new Thread(()->{
try {
Thread.sleep(1000); // assuming a delay for some operations
System.out.println(Thread.currentThread().getName()+" "+finalI);
//System.out.println(Thread.currentThread().getName()+" "+ i); // can't do this.
} catch (Exception e) {
e.printStackTrace();
}
}).start();

}
}
}

方法的局部变量保留在堆栈中,并在方法结束后立即丢失。而本地声明的最终变量/对象即使在方法结束后也可以访问,因为它们被其他类/方法引用,在这种情况下它是可运行的。

所以当我们执行时

final int finalI = i;

我们正在创建一个新的finalI变量,它既不能改变前一个变量,也不能使前一个线程使用该值,因为早期的finalI是单独放入JVM堆中的。

关于java - 在匿名线程中使用最终变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48293229/

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