线程有单独的局部变量副本。我有一个创建哈希表对象的方法。对于两个不同的线程,是否会有两个不同的哈希表对象副本?然后将哈希表对象传递给其他方法。
示例方法:
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);
}发布于 2014-11-05 20:51:38
示例中的hashtable是一个局部变量,将为该方法的每次调用创建该变量。
这是因为每次你调用你的函数的时候
final Hashtable<String,String> parameterMap=new Hashtable<String,String>();创建一个新的hashtable并将其放在parameterMap中。我不知道您需要hashtable的目的是什么,但是如果您在方法之外需要它,那么您可能希望以其他方式在的类上创建它
现在来回答你的问题:
线程具有单独的局部变量副本
嗯,不仅仅是线程。局部变量有减速的范围。当您离开作用域(在本例中是函数)时,将删除局部变量。下一次调用将创建新变量,这意味着每次调用函数都将具有不同的局部变量,即使它们的值是相同的
对于两个不同的线程,是否会有两个不同的哈希表对象副本?
我想答案对你来说已经很清楚了,是的,不同的线程会有不同的hashtable副本
发布于 2014-11-05 20:52:20
对于两个不同的线程,是否会有两个不同的哈希表对象副本?
是。
在创建线程时,每个线程都创建了自己的堆栈。该堆栈不与其他线程共享。每次调用该方法时,都会为该特定线程创建一个局部变量(哈希表本身将在对象堆上创建,对此哈希表的引用将保存在堆栈中)。
例如,如果你从两个不同的线程调用这个方法,你最终会在对象堆上有2个HashTables,在它们的线程堆栈上有2个引用。
发布于 2014-11-05 20:55:47
虽然new Hashtable<String,String>()将在堆上创建parameterMap对象,但它将由您的本地变量parameterMap指向。因此,每个线程作为一个轻量级进程运行,在相同的进程地址空间中运行,共享全局数据,但独立的堆栈,因此独立的局部变量。要共享,您可以在类中将parameterMap声明为实例变量(如果跨线程共享实例)或类静态变量。
https://stackoverflow.com/questions/26757594
复制相似问题