multithreading - 从另一个线程修改局部变量是什么意思?

标签 multithreading scala jvm stack

我编写了以下简单的应用程序:

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/

相关文章:

java - 静态 block 之间的对象依赖关系如何解决?

Python 相当于 Java 的 `tryLock`(惯用语)?

c++ - 超时后如何终止函数调用?

java - 从不正确的线程 Android 访问 Realm

scala - 如何在scala中对两个或多个正则表达式使用模式匹配

java - 是否必须将引用设置为 null 才能使垃圾收集工作

python - 使用多处理控制 Python 中的进程数

scala - 如何在Spark SQL中使用连字符对列名进行转义

scala - 类型参数化和奇怪的转换异常

java - Java 编译器和 JVM 是用哪种语言编写的?