【发布时间】:2018-06-25 20:51:16
【问题描述】:
这样做安全吗
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% 确定。
如果 anon 类要引用该变量的外部引用,那将是错误的,但它不是真正的引用,因为它是一个原始类型。那么线程 anon 类到底是如何存储变量的?
在幕后,JVM 是否让它在匿名线程中提供一个字段 private final int finalI,然后在构造函数中隐式设置它?
【问题讨论】:
-
它被捕获并存储在 Runnable 对象上。它不能改变。
-
很好,但是 JVM 是否隐含地为 Runnable 创建了一个构造函数?
-
它在后台创建了一个字段。我看不出构造函数与它有什么关系。
-
嗯,好吧,我猜它不需要构造函数,因为在类中你可以执行“final int finalI = someNum”而不是执行“final int finalI;然后在构造函数中设置它”
-
我如何接受评论作为答案?
标签: java multithreading concurrency thread-safety visibility