![](/img/trans.png)
[英]How do Inner blocks in Java access local variables which are supposed to be out-of-scope? (How the JVM treats final local variables in Java)
[英]Scala treats “sharing” local variables in threading differently from Java? How does it work?
我对局部变量如何工作的心理模型是存储在堆栈中,每个线程都有自己的堆栈,并且不能在线程之间访问堆栈。
在Java中,我实际上不确定如何在生成的线程中修改局部变量,因为编译器抱怨我无法在lambda或内部类中修改它。
但是,在Scala中我可以这样做:
implicit val ec = scala.concurrent.ExecutionContext.global
var i = 5
val f = Future {
println((1, i))
i = 6
println((1, i))
}
val g = Future {
println((2, i))
println((2, i))
println((2, i))
}
Await.result(f, 3.seconds)
并获得结果
(2,5)
(1,5)
(2,5)
(2,6)
(1,6)
线程#2如何看到线程#1的修改?
你是完全正确的。 每个线程都有自己的堆栈,局部变量驻留在堆栈上。
这就是Java局部变量应该是最终或有效最终的原因。 但是你可以使用一个众所周知的单元素数组技巧,因此指向数组的指针实际上是最终的并且驻留在堆栈上,但是数组的元素可以从闭包内更改。 像这样:
int a[] = new a[0];
Thread t = new Thread(() -> {
a[0] = 1;
});
//...
在Scala编译器中为您做类似的事情并将它们放在堆而不是堆栈本身。 (对不起,不能写一个简单的Scala示例并立即查看它的字节码,但javap -c
非常简单易读)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.