(同様の質問は、ここに頼まれていたJavaたXPathFactoryのスレッドの安全性を、それがドキュメント状態という事実無視するため、与えられた答えは間違っているXPathFactory.newInstance()
スレッドセーフではありませんが。)
よりたXPathFactoryのJavadoc、我々は持っています:
たXPathFactoryクラスはスレッドセーフではありません。換言すれば、最大で1つのスレッドが任意の時点でたXPathFactoryオブジェクトを使用していることを確実にするために、アプリケーションの責任です。同期として実装が壊れてクライアントから身を守るためにマーク方法に奨励されています。
たXPathFactoryは再入されていません。newInstanceメソッドのいずれかが呼び出されている間、アプリケーションがあっても、同じスレッドからのnewInstanceのメソッドInvoke再帰的にしようとしなくてもよいです。
したがって、上記の引用から、私はそれをそれを取るXPathFactory.newInstance()
(静的メソッド)を同時に呼び出すことはできません。これは、スレッドセーフではありません。
この持つ工場が戻るのXPathオブジェクト、XPathのJavadocを:
XPathオブジェクトはスレッドセーフではありませんし、リエントラントではありません。言い換えれば、1つのXPathオブジェクトは、任意の時点で複数のスレッドから使用されていないことを確認するために、アプリケーションの責任である、とメソッドが呼び出される評価する一方で、アプリケーションは再帰的メソッドを評価呼び出すことはできません。
上記の引用から、私はそれをそれを取るXPath.evaluate
とXPathExpression.evaluate
同時に呼び出すことはできません。彼らは、スレッドセーフではありません。
通常、私は、スレッドセーフではありません、私はちょうどローカル変数を使用するクラスを扱っていたときに、しかしので、XPathFactory.newInstance()
スレッドセーフで、それは静的メソッドですされていない、私は確かにどのように安全かつ効率的にそれを使用しませんよ。私は、私が電話を同期させることができると思いますnewInstance
が、私のアプリケーションは、アプリケーションのルーティングXMLメッセージであるので、私はパフォーマンス心配します。(私の煙のテストではnewInstance
、それ〜0.4ミリ秒かかります。)
私は、スレッドセーフな方法で使用するJavaのXPathのいずれかの例を見つけることができない、と私はスレッドセーフが、効率的な方法でXPathを使用する方法を知って自信を持っていませんよ。また、私はシングルトン(特に内部でXPathを使用する必要があるという制約持っているApacheのキャメルプロセッサを)。
私はそれをそれを取る
XPathFactory.newInstance()
(静的メソッド)を同時に呼び出すことはできません。これは、スレッドセーフではありません。
資料には、異なって解釈することができますことは可能であるので、スレッドセーフと再入は、明確な属性であるXPathFactory.newInstance()
スレッドセーフまだ非リエントラントであることを。言葉は、再帰的に重要なようです。しかし、文の構造を解析することは困難です。分詳細にコードをレビューせずに、任意の周りの同期newInstance
呼び出しはそれらを使用する唯一の安全な方法です。Javaの9を追加したことを注意newDefaultInstance
自明スレッドセーフで表示される方法を、。
私はそれをそれを取る
XPath.evaluate
とXPathExpression.evaluate
同時に呼び出すことはできません。彼らは、スレッドセーフではありません。
合意されました。ドキュメントは明らかに、これらのメソッドは、スレッドセーフでもリエントラントでもない述べています。