gpt4 book ai didi

java - Lambda 捕获实例变量

转载 作者:行者123 更新时间:2023-12-04 20:46:10 24 4
gpt4 key购买 nike

通过在令人沮丧的调试 session 之后阅读 JLS,我发现 lambdas 将捕获有效最终局部变量的值,但是如果您引用一个实例变量,它会捕获对该变量的引用,这对多线程代码有严重的影响。

例如,以下是从一个更大的程序中提取的 MCVE:

public class LambdaCapture
{
public static void main(String[] args) throws Exception
{
Launcher i1 = new Launcher();
i1.launchAsynchTask();
}

public static class Launcher
{
private int value = 10;

public void launchAsynchTask() throws Exception
{
System.out.printf("In launchAsynchTask value is %s\n",value);
Thread t = new Thread(()->doSomething(value));
t.start();
value = -1;
t.join();
}

public void doSomething(int value)
{
System.out.printf("In asynch task, value is %s\n",value);
}
}
}

我发现输出令人惊讶。这是
In launchAsynchTask value is 10
In asynch task, value is -1

因为我最初(在 JLS 研究之前)并直觉地期望 lambda 捕获变量 value 的值而不是对它的引用。

如果我必须保证捕获当前值而不是引用,那么明显的解决方案是创建一个本地最终临时值:
        final int capture = this.value;
Thread t = new Thread(()->doSomething(capture));

我的问题:这是强制值(value)捕获的公认惯用方式,还是有其他更自然的方式来做到这一点?

最佳答案

I ... intuitively expected the lambda to capture the value of the variable value instead of a reference to it.



那(捕获值)就是局部变量发生的事情。

对于字段,实际发生的是您正在捕获对该字段所属对象实例的引用。在您的情况下,它是对 Launcher.this 的引用。目的。 (当你声明一个内部类时也会发生同样的事情。)

My question: Is this the accepted idiomatic way to force value capture, or is there some other more natural way to do it?



我想不出更好的办法。

关于java - Lambda 捕获实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41083966/

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