DocumentBuilder.parse() 스레드는 안전합니까?
-
09-06-2019 - |
문제
표준 Java 1.6입니까? javax.xml.parsers.DocumentBuilder 클래스 스레드 안전?여러 스레드에서 병렬로 구문 분석() 메서드를 호출하는 것이 안전한가요?
JavaDoc에서는 이 문제를 언급하지 않지만 동일한 클래스에 대한 JavaDoc Java 1.4에서는 구체적으로 다음과 같이 말합니다. 그렇지 않다 동시성을 의미합니다.그럼 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 경로를 사용하는 경우 이 호출을 잊지 마세요. 그렇지 않으면 곤란해집니다.
이 코드를 확인하여 추가 최적화를 수행할 수도 있습니다. https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java