xml 解析を行う関数があります。関数をスレッドセーフにしたいだけでなく、可能な限り最適化 (ブロッキングを少なく) したいと考えています。
短いコードでは、次のようなものです。
public Document doXML(InputStream s)
{
//Some processing.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
Document xmlDoc = parser.parse(is);
return xmlDoc;
}
しかし、各呼び出しで新しい DocumentBuilderFactory または DocumentBuilder を作成したくありません。
ファクトリとパーサーを再利用したいのですが、それらがスレッドセーフかどうかわかりません。では、最も最適なアプローチは何ですか?
1) DocumentBuilderFactory をクラス フィールドにキャッシュし、factory.newDocumentBuilder(); を同期します。各スレッドが DocumentBuilder の独自のインスタンスを持つようにします。
2) DocumentBuilderFactoryとDocumentBuilder をキャッシュし、parser.parse(is); を同期します。スレッドごと
に (2) が最適だと思いますが、安全に実行できますか? また、同期によるブロックを回避できますか? できるだけ速くしたいと思います。
ありがとう?