【问题标题】:What does it mean to modify local variable from another thread?从另一个线程修改局部变量是什么意思?
【发布时间】:2018-09-30 03:55:00
【问题描述】:

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

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
    }
}

【问题讨论】:

    标签: multithreading scala jvm stack


    【解决方案1】:

    v 在这种情况下不是局部变量。它是Main 单音对象的成员。

    第二个例子的更新: 闭包() => v = 1 被编译成一个匿名类,该类捕获它所依赖的所有变量。堆栈分配的原语变成了堆分配的对象。 这里详细解释一下: How does the memory management of closures in Scala work?

    【讨论】:

    • 更新了我的答案
    【解决方案2】:

    这样做的目的是将看似堆栈对象的东西变成堆对象。在 Java 中,您可以使用 1 的数组来做到这一点,而无需像 Scala 那样添加特殊类。

    public static void main(String... args) {
        int[] v = { 0 };
        Thread t = new Thread(() => v[0] = 1);
        t.start();
        t.join();
        println(v[0]); //prints 1
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2013-07-21
      • 1970-01-01
      相关资源
      最近更新 更多