Комментарии 6
По моему ошибка не в самом thread local, а в известной проблеме «утечки памяти» из за не статических внутренних классов. Хотя Вы это написали :) Но я таки бы сделал упор, что это ошибка утечки памяти с внутренними классами, а как одно из проявлений — работа с ThreadLocal.
Ссылки по теме:
blogs.oracle.com/olaf/entry/memory_leaks_made_easy
habrahabr.ru/post/132500/
P.S. А вообще статья понравилась!
Ссылки по теме:
blogs.oracle.com/olaf/entry/memory_leaks_made_easy
habrahabr.ru/post/132500/
P.S. А вообще статья понравилась!
+2
Но я таки бы сделал упор, что это ошибка утечки памяти с внутренними классами, а как одно из проявлений — работа с ThreadLocal.
Внутренние классы — это случай, в котором проще всего словить такую утечку, и который потом очень сложно обнаружить.
Однако в запутанных иерархиях классов легко и непринужденно можно выстрелить в ногу и без внутренних классов. К слову там, где я это впервые нашел, не было никаких внутренних классов :-)
Пожалуй, у описанной мною проблемы ноги растут из использования словарей со слабыми ссылками на ключи, на которых построены ThreadLocal-ы.
И при встрече в коде с ThreadLocal или WeakHashMap у программиста должен в голове раздаваться тревожный звоночек: «а что туда кладется? хорошо ли я подумал, прежде чем так сделать? не лучше ли предварительно переупаковать мои данные в какую-то простую структуру без циклических ссылок?»
P.S. За ссылки спасибо.
+1
Типичный сценарий использования
Нестатичный
Кстати, вместо
ThreadLocal
— делать его самого static
.Нестатичный
ThreadLocal
— экзотика, которая как раз и приводит к описанным проблемам.Кстати, вместо
getOrCreate()
есть ThreadLocal.initialValue()
.+6
Блох писал: «Делайте внутренние классы нестатическими лишь при крайней необходимости...»
+4
Как я понимаю, проблемы бы не возникло, если бы ключи внутри мапы
ThreadLocalVariable -> ThreadLocalValue
были бы тоже weak?0
Как я понимаю, проблемы бы не возникло, если бы ключи внутри мапы ThreadLocalVariable -> ThreadLocalValue были бы тоже weak?
Ключи там и так на WeakReference-ах сделаны, но это не помогает т.к. в примере каждый объект ThreadLocal остается видим напрямую (не-weak) из своего значения.
Вы возможно хотели сказать, «если бы значения внутри мапы… были тоже weak»?
В этом случае конечно утечки бы не возникало. Но и пользоваться такой мапой было бы практически невозможно — она теряла бы значения в произвольные моменты времени при сборке мусора, если нет других ссылок на значения.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Утечка памяти с ThreadLocal