Java 在函数多线程环境中创建变量

Java 在函数多线程环境中创建变量,java,multithreading,Java,Multithreading,你能帮帮我吗 我在Java中有一个函数“f”。该函数在多线程环境中工作 f() { SomeObject someO = new SomeObject(); function1(someO); . . . function7(someO); } 问题是:第一个线程进入函数“f”并创建SomeObject的新实例,然后调用function1、function2等。当第一个线程在function4中时,第二个线程立即进入该方法并创建SomeObject的新指令。问题是函

你能帮帮我吗

我在Java中有一个函数“f”。该函数在多线程环境中工作

f() {

SomeObject someO = new SomeObject();


  function1(someO);
  .
  .
  .
  function7(someO);

}

问题是:第一个线程进入函数“f”并创建SomeObject的新实例,然后调用function1、function2等。当第一个线程在function4中时,第二个线程立即进入该方法并创建SomeObject的新指令。问题是函数5、6、7的其余部分中的第一个线程将处理SomeObject的哪个实例?

第一个线程将其SomeObject的实例(也称为some0)作为局部变量,因此它是该stackframe的局部变量,因此也是该线程的局部变量。它将只能引用some0的实例

任何其他调用f的线程都将创建一个不同的实例(也称为some0),并且只能引用该实例的副本

这些是局部变量的规则。如果some0是一个实例变量(即,在f之外声明),那么如果不同线程在持有f定义的任何类的同一实例上调用f,则该变量可以被不同线程引用

这些是规则-这里有一个更完整的解释

局部变量在堆栈上声明;这意味着,对于在方法中声明的任何变量,在该方法调用的“堆栈框架”中都有其引用的空间。每次调用一个方法时,堆栈上都会为该方法中的所有局部变量分配空间,因此它们的引用与该方法的任何其他调用是分开的。因此,如果另一个线程调用该方法,它将为局部变量获取不同的堆栈帧


同样的事情也发生在递归过程中,也就是说,如果f调用自己。对于f的每次调用,局部变量引用仍然是独立的,即每个递归调用都有自己的副本。否则就很难使用递归。

第一个线程将处理某个对象的第一个实例。
每个线程都创建自己的堆栈。它调用的任何方法和创建的任何本地对象都将存在于该堆栈中,并且这些对象不受其他线程的影响。因此,在您的情况下,线程1的处理不会受到线程2的处理的影响。

来自两个不同线程的调用将创建两个不同的实例,将它们分配给两个不同的局部变量,并将每个变量传递给每个函数。您认为会发生什么与此不同的情况以及原因?同样重要的是,Java语言规范保证了这种行为。通常这是一个好处:因为局部变量是在每次调用方法时重新创建的,所以它们是线程安全的,因为它们与其他调用不共享内存。这在并发编程中经常被用来保证局部变量在其他线程可以看到的地方发布之前是安全的。