2014-11-05 102 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作爲實例變量(如果跨線程共享實例)或類靜態變量。