关于java:DocumentBuilder.parse()线程安全吗?

关于java:DocumentBuilder.parse()线程安全吗?

Is DocumentBuilder.parse() thread safe?

标准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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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路由,请不要忘记调用此方法,否则您将陷入困境。


您还可以检查此代码以进行进一步优化https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml /XmlUtil.java


推荐阅读

    linux外部命令调用?

    linux外部命令调用?,系统,软件,标准,命令,盘中,管理,外部,进程,程序,内存,lin

    linux怎么调用命令行?

    linux怎么调用命令行?,系统,地址,工具,工作,首页,终端,命令,密码,信息,情况,l

    linux下并行运行命令?

    linux下并行运行命令?,系统,服务,工作,命令,环境,网络,暂停,文件,脚本,参数,l

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    linux线程查询命令?

    linux线程查询命令?,系统,第一,线程,命令,软件,名称,信息,进程,选项,方法,Lin

    linux下并行运行命令?

    linux下并行运行命令?,系统,服务,工作,命令,环境,网络,暂停,文件,脚本,参数,l

    py调用linux的命令?

    py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,lin

    linux系统命令调用?

    linux系统命令调用?,系统,单位,工具,工作,管理,地址,权威,密码,电脑,信息,怎

    linux调用上一条命令?

    linux调用上一条命令?,系统,命令,一致,数字,名称,网上,电脑,目录,空格,终端,l

    linux命令行调用程序?

    linux命令行调用程序?,工具,环境,代码,初级,工程,系统,网上,服务,管理,发行,l

    linux多线程下载命令?

    linux多线程下载命令?,软件,工具,平台,中心,系统,代理,网络,网站,手机,官方

    linux使用命令的方法?

    linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,

    linux断开线程命令?

    linux断开线程命令?,系统,状态,工作,代码,线程,入口,网络,管理,名称,命令,lin

    脚本调用linux命令?

    脚本调用linux命令?,代码,系统,工作,底部,脚本,位置,环境,行用,官网,标准,typ

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    linux停止线程的命令?

    linux停止线程的命令?,系统,软件,代码,产品,进程,第一,管理,生产,通信,工具,l

    linux超线程查看命令?

    linux超线程查看命令?,系统,第一,信息,软件,命令,数据,工具,实时,界面,个数,L

    linux查看多线程命令?

    linux查看多线程命令?,系统,第一,线程,地址,数据,进程,命令,名称,软件,情况,

    linux执行线程命令?

    linux执行线程命令?,系统,工作,线程,软件,服务,管理,信息,环境,名称,命令,lin