2013-07-06 4 views
3

I found that declaring a variable as static makes no sense в Многопоточность. Я предполагаю, что это из-за every thread has its own stack. Это единственная причина?Статические переменные при многопоточности

Я знаю, что static variables should be used within synchronized block. но почему?

+0

Как вы подразумеваете «не имеет смысла»? –

+0

Я имел в виду, что это значение не является общим для каждого потока. – R9J

+0

_I обнаружил, что объявление переменной как статического смысла не имеет смысла в Multi-Threading_ '[править]' – DaoWen

ответ

11

Статический не имеет смысла в многопоточности.

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

каждый поток имеет свой собственный стек

Это правильное утверждение. Each thread has its own stack but they share the process heap. Стек содержит только локальные переменные, а не переменные в куче. Статические переменные сохраняются в разделе PermGen кучи, и, следовательно, доступ к ним должен быть хорошо защищен.

+0

Да, я не использую его в синхронизированном блоке. почему это так? – R9J

+0

Так будет ли 'static int a' переходить в память кучи или стека? – ThreaT

+0

@Juned Ahsan, не могли бы вы сообщить мне, как я могу проверить - «потоки разделяют кучу процесса». – shivam

3

Потому что первая часть вопроса уже ответила, я постараюсь ответить на второй вопрос.

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

Потому что, если вы не используете atomic, операции с переменными не являются атомарными. Вот почему вы должны блокировать переменные во время работы с ними. Но в реальном мире вы можете использовать ключевое слово volatile, что гарантирует вам, что потоки будут иметь действительные значения переменной.

2

Если вы измените переменную в многопоточной среде, новое значение может не обязательно быть видимым, поскольку оно может быть кэшировано. Это также верно и для статических переменных. Если вы не используете синхронизированный блок, вы можете вместо этого использовать volatile. Это также будет гарантировать, что различные потоки получат обновленную копию без необходимости синхронизации. Wether volatile достаточно, чтобы ваше приложение зависело от ваших требований.

1

Добавить volatile в ваше статическое объявление.

volatile гарантирует, что любой другой поток увидит самое последнее значение переменной. Таким образом, с изменчивым это будет иметь смысл.

Однако volatile не гарантирует атомарность. Если вы пишете переменную из нескольких потоков, вы можете использовать атоматику или блок synchronize.

Думаю, volatile будет в порядке.

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