Ale*_*ian 9 java xml xpath thread-safety
javax.xml.XPathFactory.newInstance()线程安全吗?
我问,因为我发现文档含糊不清.JDK 5文档根本没有提到线程安全性; 在JDK 6中,他们写了以下内容:
XPathFactory类不是线程安全的.换句话说,应用程序有责任确保在任何给定时刻最多只有一个线程正在使用XPathFactory对象.鼓励实现将方法标记为同步以保护自己免受破坏的客户端的影响.
据我所知,单独实现XPathFactory是不安全的,但做这样的事情应该是安全的:
XPath xPathEvaluator = XPathFactory.newInstance().newXPath();
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?它取决于扩展它的实际类吗?我需要synchronize包含上述语句的方法吗?
Thi*_*ilo 14
XPath xPathEvaluator = XPathFactory.newInstance().newXPath();
这是安全的,因为每个线程都有自己的工厂(感谢newInstance()).无需在此处同步.
你不能安全做的是只让工厂一次,然后在没有同步的情况下在线程之间共享它,例如作为单例.XPath实例(xPathEvaluator)本身也是如此.
小智 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)
Run Code Online (Sandbox Code Playgroud)
ZipFile进行本机调用(我相信zlib)并解压缩jar,这需要磁盘IO和处理器绑定的zip解压缩.在这个例子中,我们有1400多个线程在等待锁定.
| 归档时间: |
|
| 查看次数: |
9036 次 |
| 最近记录: |