2014-11-05 77 views
2

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

实例方法:

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

散列表就像任何其他的局部变量 - 你回答了你自己的问题... – yurib 2014-11-05 12:50:46

+1

只要这个代码,是的,每次你调用exampleMethod时会有新的实例。如果代码中的其他部分(takeRequest()将引用赋值给一个可以从不同线程访问的变量并不清楚,但看起来并非如此 – PeterMmm 2014-11-05 12:51:30

+0

是的,除非您仅调用一次pqrsObject.takeRequest和多个线程在同一个pqrsObject对象中访问/修改你的哈希映射。 – SMA 2014-11-05 12:53:10

回答

2

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

那是因为每次你打电话给你的函数的行

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

被调用,创建一个新的hashtable并把它放在parameterMap。我不知道你所需要的hashtable的,但如果你需要它的方法外,你可能想通过其他方式

现在你的问题一类的创建:

线程都单独拷贝局部变量

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

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

我猜答案现在很清楚的你,是的,会有的hashtable不同副本不同的线程

1

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

是的。

每个线程在创建线程时都创建了自己的堆栈。该堆栈不与其他线程共享。 每次调用该方法时,都会为该特定线程创建一个局部变量(散列表本身将在对象堆上创建,并且此散列表的引用将保留在堆栈上)。例如,如果您从2个不同的线程调用此方法,则最终将在对象堆中包含2个HashTable,并在它们的线程堆栈中包含2个HashTable。

1

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