Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 局部变量可以从Scala中的子线程进行变异_Multithreading_Scala_Memory - Fatal编程技术网

Multithreading 局部变量可以从Scala中的子线程进行变异

Multithreading 局部变量可以从Scala中的子线程进行变异,multithreading,scala,memory,Multithreading,Scala,Memory,今天我试图学习JVM中的内存管理,遇到了以下问题:我可以从同一个函数中生成的两个线程中变异一个局部变量吗 在Java中,如果您尝试这样的操作,代码将不会编译,产生一个错误消息“从内部类引用的局部变量必须是final或实际上是final” 为什么每种情况下的行为都不同?在Scala lambdas中,通过扩展匿名类,可以捕获局部变量。scala.runtime包包含一些用于此目的的额外类。它们有效地将局部变量提升到另一个类的实例变量中,该类的实例可以共享:在Scala lambdas中,通过扩展匿

今天我试图学习JVM中的内存管理,遇到了以下问题:我可以从同一个函数中生成的两个线程中变异一个局部变量吗

在Java中,如果您尝试这样的操作,代码将不会编译,产生一个错误消息“从内部类引用的局部变量必须是final或实际上是final”


为什么每种情况下的行为都不同?

在Scala lambdas中,通过扩展匿名类,可以捕获局部变量。
scala.runtime
包包含一些用于此目的的额外类。它们有效地将局部变量提升到另一个类的实例变量中,该类的实例可以共享:

在Scala lambdas中,通过扩展匿名类,可以捕获局部变量。
scala.runtime
包包含一些用于此目的的额外类。它们有效地将局部变量提升到另一个类的实例变量中,该类的实例可以共享:

这太神奇了!感觉很危险。是的,他们真的应该为此发出警告。但是无论如何,你可能不应该使用
var
s,我猜语言是不一样的,所以我想,一旦你用“var”声明了一个变量,就没有必要限制你对它进行变异了^^在Scala中使用
var
是非常不鼓励的,除非你确信没有其他解决方案。这太神奇了!感觉很危险。是的,他们真的应该为此发出警告。但是无论如何,你可能不应该使用
var
s,我猜语言是不一样的,所以我想一旦你用“var”声明了一个变量,就没有必要限制你对它进行变异了^^在Scala中使用
var
是非常不鼓励的,除非你确定没有其他解决方案。
public class MyClass {
  static void f() throws Exception {
    int x = 0;
    
    Thread t1 = new Thread(new Runnable() {
      public void run() {
        for(int i = 0; i < 1000; i++) {
          x = x + 1;   
        }
      }
    });
     
    Thread t2 = new Thread(new Runnable() {
      public void run() {
        for(int i = 0; i < 1000; i++) {
          x = x - 1;   
        }
      }
    });
      
    t1.start();
    t2.start();
    t1.join();
    t2.join();
    System.out.println(x);
  }
  public static void main(String args[]) throws Exception {
    for(int i = 0; i < 20; i++) {
      f();    
    }
  }
}
def f(): Unit = {
  var x = 0
  
  val t1 = new Thread(new Runnable {
    override def run(): Unit =
      (1 to 1000).foreach(_ => {x = x + 1})
  })
  
  t1.start()
  val t2 = new Thread(new Runnable {
    override def run(): Unit =
      (1 to 1000).foreach(_ => {x = x - 1})
  })
  t2.start()
  t1.join()
  t2.join()
  println(x)
}

(1 to 20).foreach(_ => f())