线程的局部变量副本

时间:2014-11-05 12:48:07

标签: java multithreading

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

示例方法:

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);

}

3 个答案:

答案 0 :(得分:2)

示例中的hashtable是一个局部变量,将为每次调用方法创建。

这是因为每次你调用你的函数行

final Hashtable<String,String> parameterMap=new Hashtable<String,String>();
调用

,创建新的hashtable并将其放入parameterMap。我不知道你需要什么hashtable,但如果你需要在方法之外,你可能想要在其他方面创建它

现在问你的问题:

  

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

好吧,不仅是线程。局部变量具有减速范围。当你离开范围(在这种情况下是函数)时,局部变量被删除。下一个调用将创建新变量,这意味着每次调用函数都会有不同的局部变量,即使它们的值相同

  

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

我想现在答案很清楚,是的,不同的帖子会有hashtable的不同副本

答案 1 :(得分:1)

  

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

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

例如,如果从2个不同的线程调用此方法,则最终会在对象堆上有2个HashTable,在它们的线程堆栈上会有2个引用。

答案 2 :(得分:1)

parameterMap,本地将在堆栈中,尽管new Hashtable<String,String>()将在堆上创建Hashtable对象,由本地变量parameterMap指向。因此,每个线程作为一个轻量级进程运行,在相同的进程地址空间中运行,共享全局数据,但是单独的堆栈,所以单独的局部变量。 要共享,您可以在类中声明parameterMap作为实例变量(如果跨线程共享实例)或类静态变量。