2008-09-11 32 views
26

Chuẩn Java 1.6 javax.xml.parsers.DocumentBuilder có an toàn không? Có an toàn khi gọi phương thức parse() từ một số luồng song song không?Chủ đề DocumentBuilder.parse() có an toàn không?

JavaDoc không đề cập đến vấn đề, nhưng JavaDoc for the same class trong Java 1.4 đặc biệt nói rằng nó không phải là có nghĩa là đồng thời; vì vậy tôi có thể giả định rằng trong 1,6 nó là?

Lý do là tôi có vài triệu tác vụ đang chạy trong ExecutorService và có vẻ tốn kém khi gọi DocumentBuilderFactory.newDocumentBuilder() mỗi lần.

Trả lời

26

Mặc dù DocumentBuilder.parse dường như không làm thay đổi trình tạo mà nó thực hiện trên thực thi mặc định Sun JDK (dựa trên Apache Xerces). Quyết định thiết kế lập dị. Bạn có thể làm gì? Tôi đoán sử dụng một 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); 
      } 
     } 
    }; 

(Disclaimer: Không phải như vậy nhiều càng cố gắng để biên dịch mã.)

19

Có một phương pháp thiết lập lại() trên DocumentBuilder mà khôi phục nó về trạng thái khi nó lần đầu tiên được tạo ra . Nếu bạn đang đi tuyến đường ThreadLocal, đừng quên gọi này hoặc bạn đang hosed.

Các vấn đề liên quan