Som*_*ame 3 stack multithreading jvm scala
我写了以下简单的应用程序:
object Main extends App {
var v: Int = 0
val t = new Thread(() => v = 1)
t.start()
t.join()
println(v) //prints 1
}
Run Code Online (Sandbox Code Playgroud)
我感到困惑的是我们从另一个线程修改局部变量......并且在主线程中可以看到该修改(由另一个线程创建).
我认为局部变量总是驻留在堆栈中(堆栈内存底部指向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
}
}
Run Code Online (Sandbox Code Playgroud)
v在这种情况下,它不是局部变量.它是Main单线对象的成员.
第二个示例的更新:Closure () => v = 1被编译成一个匿名类,捕获它依赖的所有变量.堆栈分配的原语被转换为堆分配的对象.这里详细解释:
Scala中的闭包内存管理如何工作?