2008-09-11 7 views
26

표준 Java 1.6 javax.xml.parsers.DocumentBuilder 클래스 스레드가 안전합니까? parse() 메서드를 여러 스레드에서 병렬로 호출하는 것이 안전합니까?DocumentBuilder.parse()는 스레드로부터 안전합니까?

JavaDoc은 문제를 언급하지 않지만 Java 1.4의 JavaDoc for the same class은 특별히 이 아닌 것을 의미합니다. 1.6에서 그걸 가정 할 수 있을까요?

왜냐하면 나는 ExecutorService에서 실행되는 수백만 개의 작업을 가지고 있으며 매번 DocumentBuilderFactory.newDocumentBuilder()를 호출하는 것이 비용이 많이 드는 것처럼 보입니다.

답변

26

ApacheBuilder.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); 
      } 
     } 
    }; 

(면책 조항 : 코드를 컴파일하는 시도로 너무 많이하지 않습니다.)

19

가 처음 만들 때 상태로 복원 DocumentBuilder를에 reset() 메소드가있다 . ThreadLocal 라우트를 사용하고 있다면, 이것을 부르거나 호스에 걸어 두는 것을 잊지 마십시오.

관련 문제