문제

표준 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top