Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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
Java 局部变量的线程副本_Java_Multithreading - Fatal编程技术网

Java 局部变量的线程副本

Java 局部变量的线程副本,java,multithreading,Java,Multithreading,线程有单独的局部变量副本。我有一个创建哈希表对象的方法。对于两个不同的线程,是否会有两个不同的哈希表对象副本?。然后将哈希表对象传递给另一个方法 示例方法: public void exampleMethod(String a,String b, String c) { final Hashtable<String,String> parameterMap=new Hashtable<String,String>(); parameterMap.put("k

线程有单独的局部变量副本。我有一个创建哈希表对象的方法。对于两个不同的线程,是否会有两个不同的哈希表对象副本?。然后将哈希表对象传递给另一个方法

示例方法:

public void exampleMethod(String a,String b, String c)
{

   final Hashtable<String,String> parameterMap=new Hashtable<String,String>();
   parameterMap.put("key1",a);
   parameterMap.put("key2",b);
   parameterMap.put("key3",c);

   pqrsObject.takeRequest(parameterMap);

}
在您的示例中,哈希表是一个局部变量,它将为每个方法调用创建

这是因为每次调用函数时

final Hashtable<String,String> parameterMap=new Hashtable<String,String>();
调用,创建一个新的哈希表并将其放置在parameterMap中。我不知道您需要哈希表做什么,但是如果您在方法之外需要它,您可能希望以其他方式在类上创建它

现在谈谈你的问题:

线程有单独的局部变量副本

嗯,不仅仅是线程。局部变量具有减速范围。在这种情况下,当您超出范围时,函数将删除局部变量。下一次调用将创建新变量,这意味着对函数的每次调用都将有不同的局部变量,即使它们的值相同

两个用户是否会有两个不同的哈希表对象副本 不同的线程

我想答案现在对你来说很清楚了,是的,不同的线程将有不同的哈希表副本

对于两个不同的线程,是否会有两个不同的哈希表对象副本

创建线程时,每个线程都有自己的堆栈。该堆栈不与其他线程共享。 每次调用该方法时,都会为该特定线程创建一个局部变量。哈希表本身将在对象堆上创建,对该哈希表的引用将保留在堆栈上

例如,如果您从两个不同的线程调用此方法,您将在对象堆上得到两个哈希表,在它们的线程堆栈上得到两个引用。

parameterMap,本地将在堆栈上,尽管新的哈希表将在堆上创建哈希表对象,由本地变量parameterMap指向。因此,作为轻量级进程运行的每个线程,在相同的进程地址空间中运行,共享全局数据,但独立堆栈,因此分离局部变量。
要共享,如果跨线程或类静态变量共享实例,则可以将类中的parameterMap声明为实例变量。

哈希表与其他任何变量一样是局部变量-您自己回答了这个问题…只要使用此代码,每次调用exampleMethod时都会有新实例。如果代码中的其他部分将引用分配给可以从不同线程访问的变量,则不清楚。但情况似乎并非如此。是的,除非您只调用一次pqrsObject.takeRequest,并且多个线程在同一pqrsObject对象中访问/修改您的哈希映射,否则将是这样。