2014-11-05 5 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

a hashtable - это локальная переменная, как и любая другая - вы ответили на свой вопрос ... – yurib

+1

До тех пор, пока этот код, да, будут появляться новые экземпляры каждый раз, когда вы вызываете exampleMethod. Если другие части кода (takeRequest() назначают ссылку на переменную, к которой можно получить доступ из разных потоков, неясно. Но, похоже, это не так. – PeterMmm

+0

да, это будет, если вы не вызываете pqrsObject.takeRequest только один раз и несколько потоков, обращающихся/изменяющих вашу хэш-карту в том же объекте pqrsObject. – SMA

ответ

2

hashtable в вашем примере локальная переменная и будет создана для каждого вызова метода.

это потому, что каждый раз, когда вы называете функции линии

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

называется, создавая новый hashtable и поместить его в parameterMap. я не знаю, что вам нужно hashtable, но если вам это нужно вне метода вы можете создать его на классе других способов

теперь ваш вопрос:

Темы есть отдельная копия местных переменных

ну, не только темы. локальная переменная имеет диапазон замедления. когда вы выходите из области действия (в этом случае функция) локальная переменная удаляется. следующий вызов будет создавать новые переменные, то есть каждый вызов функции будет иметь разные локальные переменные, даже если их значение совпадает

Будут ли две разные копии хэш-таблицу объектов для двух разных потоков?

я думаю, теперь ответ ясен для вас, да, там будут разные копии hashtable для различных нитей

1

Будут ли две разные копии хэш-таблицу объектов для двух разных потоков?.

Да.

Каждый поток имеет свой собственный стек, созданный при создании потока. Этот стек не используется совместно с другими потоками. Каждый раз, когда вы вызываете этот метод, создается локальная переменная для этого конкретного потока (сама хэш-таблица будет создана на кучи объектов, а ссылка на эту хэш-таблицу будет храниться в стеке).

Например, если вы вызываете этот метод из 2 разных потоков, в итоге вы получите 2 HashTables на кучи объектов и 2 ссылки на их стек стеков.

1

parameterMap, будучи локальным, будет находиться в стеке, хотя new Hashtable<String,String>() создаст объект Hashtable в куче, указав вашу локальную переменную parameterMap. Таким образом, каждый поток, который работает как легкий вес, работает в одном и том же адресном пространстве процесса, разделяет глобальные данные, но отдельный стек, поэтому отдельные локальные переменные. Чтобы поделиться, вы можете объявить parameterMap в своем классе как переменную экземпляра (если общие экземпляры по потокам) или статическую переменную класса.

Смежные вопросы