javax.xml.XPathFactory.newInstance()线程安全吗?
我问,因为我觉得文档含糊不清。 The JDK 5 docs根本没有提到线程安全性;在JDK 6他们写了以下内容:
XPathFactory类不是线程安全的。换句话说,就是这样 应用程序有责任确保最多一个线程 在任何给定时刻使用XPathFactory对象。实施是 鼓励将方法标记为同步以保护自己 破碎的客户。
据我了解,为XPathFactory
设置单例实现并不安全,但做这样的事情应该是安全的:
XPath xPathEvaluator = XPathFactory.newInstance().newXPath();
我错过了什么吗?它取决于扩展它的实际类吗?我需要synchronize
包含上述语句的方法吗?
答案 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多个线程等待锁定。