线程具有局部变量的单独副本。我有一个方法,其中创建一个哈希表对象。两个不同的线程是否会有两个不同的哈希表对象副本?然后将哈希表对象传递给其他方法。
示例方法:
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);
}
答案 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
作为实例变量(如果跨线程共享实例)或类静态变量。