DocumentBuilder.parse()线程安全吗?
时间:2020-03-05 18:51:31 来源:igfitidea点击:
标准的Java 1.6 javax.xml.parsers.DocumentBuilder类线程安全吗?从多个线程并行调用parse()方法是否安全?
JavaDoc没有提到这个问题,但是Java 1.4中同一类的JavaDoc特别指出它不是并发的;所以我可以假设在1.6中是吗?
原因是我在ExecutorService中运行着数百万个任务,并且每次调用DocumentBuilderFactory.newDocumentBuilder()似乎很昂贵。
解决方案
回答
即使DocumentBuilder.parse似乎没有改变构建器,它在Sun JDK默认实现(基于Apache Xerces)上也进行了改动。偏心的设计决策。你能做什么?我想使用ThreadLocal:
private static final ThreadLocal<DocumentBuilder> builderLocal = new ThreadLocal<DocumentBuilder>() { @Override protected DocumentBuilder initialValue() { try { return DocumentBuilderFactory .newInstance( "xx.MyDocumentBuilderFactory", getClass().getClassLoader() ).newDocumentBuilder(); } catch (ParserConfigurationException exc) { throw new IllegalArgumentException(exc); } } };
(免责声明:没有尝试编译代码那么多。)
回答
DocumentBuilder上有一个reset()方法,可将其还原到首次创建时的状态。如果我们要使用ThreadLocal路由,请不要忘记调用此方法,否则我们将陷入困境。