2008-09-11 14 views
26

मानक जावा 1.6 javax.xml.parsers.DocumentBuilder कक्षा धागा सुरक्षित है? क्या समानांतर में कई धागे से पार्स() विधि को कॉल करना सुरक्षित है?क्या DocumentBuilder.parse() धागा सुरक्षित है?

JavaDoc मुद्दे का उल्लेख नहीं है, लेकिन जावा 1.4 में JavaDoc for the same class विशेष रूप से कहना है कि यह समवर्ती मतलब नहीं है, तो क्या मैं मान सकता हूं कि 1.6 में यह है?

कारण यह है कि मेरे पास एक्जिक्यूटर्स सेवा में कई मिलियन कार्य चल रहे हैं, और यह हर बार DocumentBuilderFactory.newDocumentBuilder() को कॉल करना महंगा लगता है।

उत्तर

26

भले ही DocumentBuilder.parse बिल्डर को म्यूटेट नहीं करना प्रतीत होता है, यह सूर्य जेडीके डिफ़ॉल्ट कार्यान्वयन (अपाचे 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 पर एक रीसेट() विधि नहीं है । यदि आप थ्रेडलोकल मार्ग पर जा रहे हैं, तो इसे कॉल करना न भूलें या आप को रोक दिया गया है।

3
+0

बनाने के लिए यह एक शानदार लिंक था इस कोड की जांच कर सकते हैं, धन्यवाद, निश्चित रूप से JAXP सामान को विन्यस्त के साथ बेहद मदद की। –

+0

** नोट: ** 2015/10/23 तक, अपाचे शिंदिग सेवानिवृत्त हो गया है। – Stephan

संबंधित मुद्दे