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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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