2013-09-19 5 views
0

Я хотел бы повторно использовать экземпляры не-потоковых безопасных классов по соображениям производительности в Servlet. У меня есть два варианта,Использование ThreadLocal против HashMap с потоком в качестве ключа

  1. использование ThreadLocal где в Java ухаживает делает управление экземпляром для каждого потока
  2. использовать статический HashMap, который использует тему как ключ HashMap и экземпляры управляется на этом уровне

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

+1

'ThreadLocal' _is_ a' HashMap' с нитью в качестве ключа. –

+0

Вероятно, существует больше возможностей для утечек памяти с помощью вашей статической 'HashMap'. –

+1

@JimGarrison реализация ThreadLocal ** значительно сложнее, чем это. – vemv

ответ

1

Предпочитаете подход ThreadLocal, потому что он, скорее всего, синхронизирован (или, еще лучше, не требует синхронизации) с правильной детализацией и не больше.

Если вы откатываете свое собственное решение с помощью HashMap, вам придется приобретать блокировку по HashMap каждый раз, когда вы хотите получить доступ к локальным данным нити. Зачем? Потому что новый поток может быть создан, и потоки могут умереть. Это неявное добавление/удаление элементов из HashMap, для которых требуется синхронизация на полном HashMap. У вас также будет достаточно времени на сохранение жизни объектов прямо, потому что HashMap будет поддерживать все элементы, содержащиеся в нем, если он ссылается на любой поток. Это не так, как ведет себя магазин ThreadLocal.

0

Проблема не в ThreadLocal сама, но как она используется. См. here для подробного объяснения. Таким образом, ваша собственная реализация не изменит ситуацию.

Смежные вопросы