tags:

views:

1666

answers:

3

Is the standard Java 1.6 javax.xml.parsers.DocumentBuilder class thread safe? Is it safe to call the parse() method from several threads in parallel?

The JavaDoc doesn't mention the issue, but the JavaDoc for the same class in Java 1.4 specifically says that it isn't meant to be concurrent; so can I assume that in 1.6 it is?

The reason is that I have several million tasks running in an ExecutorService, and it seems expensive to call DocumentBuilderFactory.newDocumentBuilder() every time.

+1  A: 

I wouldn't assume anything. You should create an instance per thread.

Is there really a reason to share multiple instances among threads?

Will
Creating instances per thread means you have to be concerned about long running apps leaving that memory in use forever.
Jherico
+7  A: 

Even though DocumentBuilder.parse appears not to mutate the builder it does on the Sun JDK default implementation (based on Apache Xerces). Eccentric design decision. What can you do? I guess use a ThreadLocal:

private static final ThreadLocal<DocumentBuilder> builderLocal =
    new ThreadLocal<DocumentBuilder>() {
        @Override protected DocumentBuilder initialValue() {
            return
                DocumentBuilderFactory.newInstance()
                    .newDocumentBuilder();
        }
    };

(Disclaimer: Not so much as attempted to compile the code.)

Tom Hawtin - tackline
+2  A: 

There's a reset() method on DocumentBuilder which restores it to the state when it was first created. If you're going the ThreadLocal route, don't forget to call this or you're hosed.

trenton