どのように私は、スレッドセーフかつ効率的にXPathを使うのですか?

ダービッツ:

(同様の質問は、ここに頼まれていたJavaたXPathFactoryのスレッドの安全性を、それがドキュメント状態という事実無視するため、与えられた答えは間違っているXPathFactory.newInstance()スレッドセーフではありませんが。)

よりたXPathFactoryのJavadoc、我々は持っています:

たXPathFactoryクラスはスレッドセーフではありません。換言すれば、最大で1つのスレッドが任意の時点でたXPathFactoryオブジェクトを使用していることを確実にするために、アプリケーションの責任です。同期として実装が壊れてクライアントから身を守るためにマーク方法に奨励されています。

たXPathFactoryは再入されていません。newInstanceメソッドのいずれかが呼び出されている間、アプリケーションがあっても、同じスレッドからのnewInstanceのメソッドInvoke再帰的にしようとしなくてもよいです。

したがって、上記の引用から、私はそれをそれを取るXPathFactory.newInstance()(静的メソッド)を同時に呼び出すことはできません。これは、スレッドセーフではありません。

この持つ工場が戻るのXPathオブジェクト、XPathのJavadocを

XPathオブジェクトはスレッドセーフではありませんし、リエントラントではありません。言い換えれば、1つのXPathオブジェクトは、任意の時点で複数のスレッドから使​​用されていないことを確認するために、アプリケーションの責任である、とメソッドが呼び出される評価する一方で、アプリケーションは再帰的メソッドを評価呼び出すことはできません。

上記の引用から、私はそれをそれを取るXPath.evaluateXPathExpression.evaluate同時に呼び出すことはできません。彼らは、スレッドセーフではありません。

通常、私は、スレッドセーフではありません、私はちょうどローカル変数を使用するクラスを扱っていたときに、しかしので、XPathFactory.newInstance()スレッドセーフで、それは静的メソッドですされていない、私は確かにどのように安全かつ効率的にそれを使用しませんよ。私は、私が電話を同期させることができると思いますnewInstanceが、私のアプリケーションは、アプリケーションのルーティングXMLメッセージであるので、私はパフォーマンス心配します。(私の煙のテストではnewInstance、それ〜0.4ミリ秒かかります。)

私は、スレッドセーフな方法で使用するJavaのXPathのいずれかの例を見つけることができない、と私はスレッドセーフが、効率的な方法でXPathを使用する方法を知って自信を持っていませんよ。また、私はシングルトン(特に内部でXPathを使用する必要があるという制約持っているApacheのキャメルプロセッサを)。

jaco0646:

私はそれをそれを取るXPathFactory.newInstance()(静的メソッド)を同時に呼び出すことはできません。これは、スレッドセーフではありません。

資料には、異なって解釈することができますことは可能であるので、スレッドセーフと再入は、明確な属性であるXPathFactory.newInstance()スレッドセーフまだ非リエントラントであることを。言葉は、再帰的に重要なようです。しかし、文の構造を解析することは困難です。分詳細にコードをレビューせずに、任意の周りの同期newInstance呼び出しはそれらを使用する唯一の安全な方法です。Javaの9を追加したことを注意newDefaultInstance自明スレッドセーフで表示される方法を、。

私はそれをそれを取るXPath.evaluateXPathExpression.evaluate同時に呼び出すことはできません。彼らは、スレッドセーフではありません。

合意されました。ドキュメントは明らかに、これらのメソッドは、スレッドセーフでもリエントラントでもない述べています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=184278&siteId=1