Если спор не является фактором, блокировка (синхронизация) будет одним из вариантов, как вы упомянули, и это может быть достаточно хорошим.
Если есть утверждения, я вижу три общих варианта.
(1) инстанцировании это каждый раз
Просто используйте его в качестве локальной переменной каждый раз, когда вы выполняете синтаксический анализ. Локальные переменные тривиально безопасны. Контекст не свободен, конечно, но может быть приемлемым в зависимости от конкретной ситуации.
(2) с использованием threadlocals
Если конкретизации оказывается дорогостоящим, рассмотреть вопрос об использовании threadlocals. Каждый поток сохранит свою собственную копию синтаксического анализатора, и экземпляр синтаксического анализатора будет повторно использоваться в заданном потоке. Однако Threadlocals не без проблем. Threadlocals может не быть собранным мусором, не будучи установленным в null или пока удерживающая нить не исчезнет. Поэтому есть проблема с памятью, если их слишком много. Во-вторых, остерегайтесь повторного использования. Если эти парсеры являются работоспособными, вам необходимо обеспечить очистку и восстановление исходного состояния, поэтому последующее использование экземпляра threadlocal не страдает от побочного эффекта предыдущего использования.
(3) объединение
Пулы в целом больше не рекомендуется, но если размеры объекта действительно большой, так что вы должны иметь жесткое ограничение на количество экземпляров вы можете позволить, а затем с помощью объекта пул может быть лучшим вариантом.
«большой» он имеет размер от 300 до 600 МБ. – 2010-12-03 20:00:54