David Moles
David Moles

Reputation: 51113

Is DocumentBuilderFactory thread-safe in Java 5+?

The Java 1.4 doc for javax.xml.parsers.DocumentBuilderFactory states in no uncertain terms:

An implementation of the DocumentBuilderFactory class is NOT guaranteed to be thread safe. It is up to the user application to make sure about the use of the DocumentBuilderFactory from more than one thread. Alternatively the application can have one instance of the DocumentBuilderFactory per thread. An application can use the same instance of the factory to obtain one or more instances of the DocumentBuilder provided the instance of the factory isn't being used in more than one thread at a time.

The Java 5 and Java 6 docs, however, say nothing of the kind. Is DocumentBuilderFactory thread-safe now, or did Sun just decide the warning was overkill and people should know better?

Upvotes: 19

Views: 11843

Answers (4)

kan
kan

Reputation: 28951

Looking into source code, the DocumentBuilderFactory is not thread-safe in a way that you could not manipulate it from multiple threads. However, if you create it once, configure with features/attributes/etc, you could pass it (with happens-before) into multiple threads and invoke newDocumentBuilder concurrenly.

It is a similar story as with e.g. simple collections like ArrayList. If you construct and populate it safely from a single thread, you could later read it from multiple threads, but you are not allowed to modify it without synchronisation.

Upvotes: 0

David Moles
David Moles

Reputation: 51113

I haven't actually looked at this in some time, but looking at the source for DocumentBuilderFactoryImpl and DocumentBuilderImpl it looks to me like it's probably a bad idea. The factory has a bunch of internal state, and the builder modifies that state during its construction -- see the call to setDocumentBuilderFactoryAttributes in the DocumentBuilderImpl constructor.

If you knew you were never going to pass in those attributes, you might be able to get away with it, but to be safe I'd want to wrap the whole thing in some other object that doesn't expose the dangerous bits, and I think it would be easier just to make sure you have a separate factory per thread.

Upvotes: 2

bdzzaid
bdzzaid

Reputation: 908

According to the documentation of the singleton DocumentBuilderFactory the newInstance method is not sychronized and then, the DocumentBuilderFactory is still not a thread safe in Java 8... Neither in Java 11. Actually, the constructor didn't change since Java 1.4.

Upvotes: 4

Pavel Rozenblioum
Pavel Rozenblioum

Reputation: 144

Since it would've been in extremely poor taste to make it thread safe without telling my money is that it's still unsafe. You can test this yourself using breakpoints.

Upvotes: -7

Related Questions