我编写了以下简单的应用程序:
object Main extends App {
var v: Int = 0
val t = new Thread(() => v = 1)
t.start()
t.join()
println(v) //prints 1
}
让我感到困惑的是,我们从另一个线程修改了局部变量......并且该修改(由另一个线程进行)在主线程中是可见的。
我认为局部变量总是驻留在堆栈中(堆栈内存底部指向 rsp
寄存器)。我以为堆栈内存是为应用程序中的每个线程分配的。
更新:即使我们如下修改应用程序,它也会打印相同的内容:
object Main {
def main(args: Array[String]) = {
var v: Int = 0
val t = new Thread(() => v = 1)
t.start()
t.join()
println(v) //prints 1
}
}
最佳答案
v
在这种情况下不是局部变量。它是 Main
单音对象的成员。
第二个例子的更新:
闭包 () => v = 1
被编译成一个匿名类,该类捕获它所依赖的所有变量。堆栈分配的原语变成了堆分配的对象。
这里详细解释一下:
How does the memory management of closures in Scala work?
关于multithreading - 从另一个线程修改局部变量是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49924567/