由于并发问题,局部变量成为最终变量或有效最终变量的原因。在 jls 8 规范中,有以下规定。
The restriction to effectively final variables prohibits access to dynamically-changing local variables, whose capture would likely introduce concurrency problems.
一切都很好,但我做了一个小实验。如果我同步该方法,这将消除动态更改局部变量的可能性,因为我保证只有一个线程可以执行此代码。但编译抛出了一个错误,指出它必须是最终的或有效的最终的。
逻辑正确吗?
考虑以下代码:
public synchronized void capture() {
int localVariable = 100;
Interf i = (text) -> System.out.println(text + localVariable);
i.m1("This local variable is: ");
localVariable = 1000;
}
}
最佳答案
答案很简单,您的变量在方法结束时超出了范围。使用有效的最终变量可以轻松解决这个问题,因为编译器只是将值复制到 lambda 中。由于 lambda 表达式中的代码也可以在方法外部运行(其中可修改变量已被垃圾回收),因此这是行不通的。您也不能指望编译器以某种方式复制您的变量,然后在 lambda 表达式之外修改它时动态更改它。我希望这能解决问题。
关于带有局部变量捕获的 Java lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58208717/