2010-05-06 4 views
82

Я читал JavaDoc для ThreadLocal здесьПочему Java ThreadLocal переменные должны быть статическими

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadLocal.html

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

Но мой вопрос в том, почему они решили сделать его статическим (как правило) - это немного сбивает с толку состояние «на поток», но поля являются статическими?

ответ

96

Потому что, если это было поле уровня экземпляра, на самом деле это будет «Per Thread - Per Instance», а не только гарантированный «Per Thread». Обычно это не семантика, которую вы ищете.

Обычно у него есть объекты, которые привязаны к пользовательскому диалогу, веб-запросу и т. Д. Вы не хотите, чтобы они также подпадают под экземпляр класса.
Один веб-запрос => один сеанс сохранения.
Не один веб-запрос => один сеанс персистенции на объект.

+1

Мне нравится это объяснение, потому что оно показывает, как использовать ThreadLocal. – kellyfj

+3

Per-thread-per-instance может быть полезной семантикой, но в большинстве случаев для этого шаблона будет задействовано так много объектов, что было бы лучше использовать ' ThreadLocal', чтобы сохранить ссылку на хеш-набор, который сопоставляет объекты с экземплярами на потоках. – supercat

+0

Хорошее объяснение! – ADJ

3

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

9

Этого не должно быть. Важно то, что он должен быть синглом.

13

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

0

Использование для threadlocal по каждому экземпляру на поток - это то, что вы хотите, чтобы что-то было видимым во всех методах объекта и обеспечило его потокобезопасность без синхронизации доступа к нему, как и для обычного поля.

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