首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >局部变量的线程副本

局部变量的线程副本
EN

Stack Overflow用户
提问于 2014-11-05 20:48:07
回答 3查看 1.5K关注 0票数 2

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

示例方法:

代码语言:javascript
复制
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);

}
EN

回答 3

Stack Overflow用户

发布于 2014-11-05 20:51:38

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

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

代码语言:javascript
复制
final Hashtable<String,String> parameterMap=new Hashtable<String,String>();

创建一个新的hashtable并将其放在parameterMap中。我不知道您需要hashtable的目的是什么,但是如果您在方法之外需要它,那么您可能希望以其他方式在的类上创建它

现在来回答你的问题:

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

嗯,不仅仅是线程。局部变量有减速的范围。当您离开作用域(在本例中是函数)时,将删除局部变量。下一次调用将创建新变量,这意味着每次调用函数都将具有不同的局部变量,即使它们的值是相同的

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

我想答案对你来说已经很清楚了,是的,不同的线程会有不同的hashtable副本

票数 2
EN

Stack Overflow用户

发布于 2014-11-05 20:52:20

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

是。

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-05 20:55:47

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26757594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档