Java XPathFactory线程安全

时间:2012-02-02 10:14:27

标签: java xml xpath thread-safety

javax.xml.XPathFactory.newInstance()线程安全吗?

我问,因为我觉得文档含糊不清。 The JDK 5 docs根本没有提到线程安全性;在JDK 6他们写了以下内容:

  

XPathFactory类不是线程安全的。换句话说,就是这样   应用程序有责任确保最多一个线程   在任何给定时刻使用XPathFactory对象。实施是   鼓励将方法标记为同步以保护自己   破碎的客户。

据我了解,为XPathFactory设置单例实现并不安全,但做这样的事情应该是安全的:

XPath xPathEvaluator = XPathFactory.newInstance().newXPath();

我错过了什么吗?它取决于扩展它的实际类吗?我需要synchronize包含上述语句的方法吗?

2 个答案:

答案 0 :(得分:14)

  

XPath xPathEvaluator = XPathFactory.newInstance()。newXPath();

这是安全的,因为每个线程都有自己的工厂(感谢newInstance())。无需在这里同步。

你不能安全地做的只是出厂一次,然后在没有同步的线程之间共享它,例如作为单例。 XPath实例(xPathEvaluator)本身也是如此。

答案 1 :(得分:5)

“其中一个是XPathFactory.newInstance()非常昂贵;”

真实的声明!我注意到,对于每个调用newInstance()的线程,jaxp.properties必须位于类路径上并读入:

java.lang.Thread.State: BLOCKED (on object monitor)
        at java.util.zip.ZipFile.getEntry(ZipFile.java:160)
        - locked <0x0000000968dec028> (a sun.net.www.protocol.jar.URLJarFile)
        at java.util.jar.JarFile.getEntry(JarFile.java:208)
        at sun.net.www.protocol.jar.URLJarFile.getEntry(URLJarFile.java:107)
        at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:114)
        at sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:132)
        at java.net.URL.openStream(URL.java:1010)
        at javax.xml.xpath.SecuritySupport$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.xml.xpath.SecuritySupport.getURLInputStream(Unknown Source)
        at javax.xml.xpath.XPathFactoryFinder._newFactory(Unknown Source)
        at javax.xml.xpath.XPathFactoryFinder.newFactory(Unknown Source)
        at javax.xml.xpath.XPathFactory.newInstance(Unknown Source)
        at javax.xml.xpath.XPathFactory.newInstance(Unknown Source)

ZipFile进行本机调用(我相信zlib)并解压缩jar,这需要磁盘IO和处理器绑定的zip解压缩。在这个例子中,我们有1400多个线程等待锁定。