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

Я читал JavaDoc для Threadlocal здесь

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

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

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

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

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

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

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

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

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

Обратите внимание на это , это дает лучшее понимание.

Короче говоря, объект ThreadLocal работает как карта значений ключа. Когда stream вызывает метод get/set ThreadLocal , он будет извлекать / сохранять объект streamа в ключе карты и значение в значении карты. Вот почему разные streamи имеют различную скопированную ценность (которую вы хотите сохранить локально), потому что она находится в записи другой карты.

Вот почему вам нужна только одна карта, чтобы сохранить все значения. Хотя это необязательно, вы можете иметь несколько карт (без объявления static), чтобы сохранить каждый объект streamа, а это, в общем, избыточно, поэтому статическая переменная является предпочтительной.

  • Разница между -pthread и -lpthread при компиляции
  • Какие реализации std :: async используют пулы streamов?
  • Правильный способ утилизации BackGroundWorker
  • Редактирование редактирования сквозных нитей
  • выход основной нити, другой выход тоже?
  • Неверная операция поперечного streamа: Control 'textBox1', доступ к которому осуществляется из streamа, отличного от streamа, который был создан на
  • Что рекомендуется для нереста streamов из сервлета в Tomcat
  • «Коллекция была мутирована при перечислении» в executeFetchRequest
  • Преимущество использования Thread.Start vs QueueUserWorkItem
  • В чем разница между Thread.start () и Thread.run ()?
  • как установить близость процессора к определенному pthread?
  • Давайте будем гением компьютера.