Как стать автором
Обновить

Комментарии 6

По моему ошибка не в самом thread local, а в известной проблеме «утечки памяти» из за не статических внутренних классов. Хотя Вы это написали :) Но я таки бы сделал упор, что это ошибка утечки памяти с внутренними классами, а как одно из проявлений — работа с ThreadLocal.
Ссылки по теме:
blogs.oracle.com/olaf/entry/memory_leaks_made_easy
habrahabr.ru/post/132500/
P.S. А вообще статья понравилась!
Но я таки бы сделал упор, что это ошибка утечки памяти с внутренними классами, а как одно из проявлений — работа с ThreadLocal.

Внутренние классы — это случай, в котором проще всего словить такую утечку, и который потом очень сложно обнаружить.

Однако в запутанных иерархиях классов легко и непринужденно можно выстрелить в ногу и без внутренних классов. К слову там, где я это впервые нашел, не было никаких внутренних классов :-)

Пожалуй, у описанной мною проблемы ноги растут из использования словарей со слабыми ссылками на ключи, на которых построены ThreadLocal-ы.
И при встрече в коде с ThreadLocal или WeakHashMap у программиста должен в голове раздаваться тревожный звоночек: «а что туда кладется? хорошо ли я подумал, прежде чем так сделать? не лучше ли предварительно переупаковать мои данные в какую-то простую структуру без циклических ссылок?»

P.S. За ссылки спасибо.
Типичный сценарий использования ThreadLocal — делать его самого static.
Нестатичный ThreadLocal — экзотика, которая как раз и приводит к описанным проблемам.

Кстати, вместо getOrCreate() есть ThreadLocal.initialValue().
Блох писал: «Делайте внутренние классы нестатическими лишь при крайней необходимости...»
Как я понимаю, проблемы бы не возникло, если бы ключи внутри мапы ThreadLocalVariable -> ThreadLocalValue были бы тоже weak?
Как я понимаю, проблемы бы не возникло, если бы ключи внутри мапы ThreadLocalVariable -> ThreadLocalValue были бы тоже weak?

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

Вы возможно хотели сказать, «если бы значения внутри мапы… были тоже weak»?
В этом случае конечно утечки бы не возникало. Но и пользоваться такой мапой было бы практически невозможно — она теряла бы значения в произвольные моменты времени при сборке мусора, если нет других ссылок на значения.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий