Очистка вектора ThreadLocal в Java

Мне известен этот похожий вопрос, но мой касается конкретного случая очистки ThreadLocal .

Чтобы поддерживать состояние на основе потока, я сохраняю (неизвестное) количество ThreadLocals в статическом векторе. Иногда «жадному» потоку требуется больше доступных ThreadLocals, и в результате размер вектора будет увеличен. Хотя очистка с помощью ThreadLocal.remove() не является проблемой в моем сценарии, мне интересно, будет ли когда-нибудь возможно уменьшить размер вектора после того, как жадный поток умрет, или если он будет только расти (или, в лучшем случае, останется прежним). ).

Чтобы уточнить: я понимаю, что для любого заданного ThreadLocal будет существовать другой экземпляр для каждого потока. Как тогда мой статический вектор мог знать, когда к нему обращаются из потока A, что значения ThreadLocal T пусты для всех существующих потоков?

Спасибо за вашу помощь


person Raul Bertone    schedule 13.03.2013    source источник


Ответы (2)


См. здесь официальные документы: Vector.trimToSize()

Альтернативно: Vector.setSize()

person Jan    schedule 13.03.2013
comment
Привет спасибо. Я знаю об этом, но мой вопрос не в том, как это сделать, а в том, возможно ли вообще уменьшить такой вектор. - person Raul Bertone; 13.03.2013
comment
@RaulBertone Я никогда их не использовал, но, читая документы, похоже, что вызов setSize() с последующим trimToSize() сделает именно то, что вы хотите. - person Windle; 13.03.2013
comment
Если вы устанавливаете хорошую IDE, довольно легко нажать CTRL+Click в этом коде. Там вы найдете копию массива в меньший массив, поэтому вектор действительно сокращает объем памяти. - person Jan; 13.03.2013

Задача, которую вы пытаетесь выполнить, нелогична. Из текущего потока вы не можете узнать, используется ли ThreadLocal другим потоком и сколько потоков вообще его использует. Вы можете попытаться объединить ThreadLocals с WeakHashMap (или кешем Guava), но это будет очень странное решение, попробуйте предотвратить рост ThreadLocals.

person Mikhail    schedule 13.03.2013
comment
Пожалуй, я с вами согласен, поэтому мне интересно, как бы повела себя программа в такой ситуации. Как бы то ни было, я придумал лучшую реализацию, в которой используется ThreadLocal‹Vector› вместо Vector‹ThreadLocal›, так что теперь на каждый поток приходится только один ThreadLocal. И все же, что если? :-) - person Raul Bertone; 13.03.2013