競合が要因でない場合は、ロック(同期)が1つのオプションであり、それで十分な場合があります。
ただし、競合がある場合は、3つの一般的なオプションが表示されます。
(1)毎回インスタンス化する
解析を実行するたびに、ローカル変数としてインスタンス化するだけです。ローカル変数は自明に安全です。もちろん、インスタンス化は無料ではありませんが、特定の状況によっては許容できる場合があります。
(2)threadlocalsを使用する
インスタンス化にコストがかかることが判明した場合は、threadlocalsの使用を検討してください。各スレッドはパーサーの独自のコピーを保持し、パーサーインスタンスは特定のスレッドで再利用されます。ただし、スレッドローカルには問題がないわけではありません。スレッドローカルは、nullに設定されていない場合、または保持しているスレッドがなくなるまで、ガベージコレクションされない場合があります。したがって、それらが多すぎると、メモリの問題が発生します。次に、再利用に注意してください。これらのパーサーがステートフルである場合は、スレッドローカルインスタンスを後で使用しても、以前の使用による副作用が発生しないように、初期状態をクリーンアップして復元する必要があります。
(3)プーリング
通常、プーリングは推奨されなくなりましたが、オブジェクトサイズが非常に大きく、許可できるインスタンスの数を厳しく制限する必要がある場合は、オブジェクトプールを使用するのが最適なオプションです。