2012-02-02 20 views
7

क्या javax.xml.XPathFactory.newInstance() थ्रेड-सुरक्षित है?जावा XPathFactory थ्रेड-सुरक्षा

मैं पूछ रहा हूं क्योंकि मुझे इसके लिए दस्तावेज अस्पष्ट लगता है। The JDK 5 docs बिल्कुल थ्रेड-सुरक्षा का जिक्र नहीं है; JDK 6 में उन्होंने निम्नलिखित लिखा:

XPathFactory क्लास थ्रेड-सुरक्षित नहीं है। दूसरे शब्दों में, यह सुनिश्चित करने के लिए एप्लिकेशन की ज़िम्मेदारी है कि किसी भी पल पर XPathFactory ऑब्जेक्ट का उपयोग करके अधिकांश थ्रेड है। कार्यान्वयन को टूटे हुए ग्राहकों से बचाने के लिए सिंक्रनाइज़ किए गए तरीकों को चिह्नित करने के लिए प्रोत्साहित किया गया है।

मैं इसे समझ, यह XPathFactory के लिए एक सिंगलटन कार्यान्वयन के लिए सुरक्षित नहीं है, लेकिन कुछ इस तरह कर रही है सुरक्षित होना चाहिए:

XPath xPathEvaluator = XPathFactory.newInstance().newXPath(); 

मैं कुछ याद आ रही है? क्या यह उस वास्तविक वर्ग पर निर्भर करता है जो इसे फैलाता है? क्या मुझे उपरोक्त कथन वाली विधि synchronize की आवश्यकता है?

उत्तर

11

XPath xPathEvaluator = XPathFactory.newInstance()। NewXPath();

यह सुरक्षित है, क्योंकि प्रत्येक धागे का अपना कारखाना मिलता है (newInstance() के लिए धन्यवाद)। यहां सिंक्रनाइज़ करने की आवश्यकता नहीं है।

आप सुरक्षित रूप से क्या नहीं कर सकते हैं कारखाना केवल एक बार प्राप्त करें, और उसके बाद इसे सिंक्रनाइज़ेशन के बिना धागे के बीच साझा करें, उदाहरण के लिए सिंगलटन के रूप में। XPath इंस्टेंस (xPathEvaluator) के लिए भी यही है।

+0

धन्यवाद, मैं वही सोच रहा था, लेकिन मैं फिर से आश्वासन चाहता था :)। –

+1

हमेशा हाथ पकड़ने के लिए :-) – Thilo

+5

JAXP-XPath डिज़ाइन के बारे में कई बुरी चीजें हैं। उनमें से एक यह है कि XPathFactory.newInstance() बहुत महंगा है; दूसरा यह है कि आप इसे हर धागे में बार-बार कॉल करने की उम्मीद कर रहे हैं। दूसरा यह है कि आपके पास यह जानने का कोई तरीका नहीं है कि आप XPath 1.0 इंजन या XPath 2.0 इंजन वापस ले लेंगे या नहीं। अपने आप से पूछें कि क्या आप वास्तव में इस तंत्र का उपयोग करना चाहते हैं: यदि आप जानते हैं कि आप जो XPath इंजन चाहते हैं, तो इसे लोड करने के बेहतर तरीके हैं। –

3

"उनमें से एक यह है कि XPathFactory.newInstance() बहुत महंगा है;"

सही कथन! मैंने देखा है कि) प्रत्येक थ्रेड newInstance (फोन करने के लिए, jaxp.properties classpath पर स्थित होना चाहिए और में पढ़ें:

java.lang.Thread.State: BLOCKED (on object monitor) 
     at java.util.zip.ZipFile.getEntry(ZipFile.java:160) 
     - locked <0x0000000968dec028> (a sun.net.www.protocol.jar.URLJarFile) 
     at java.util.jar.JarFile.getEntry(JarFile.java:208) 
     at sun.net.www.protocol.jar.URLJarFile.getEntry(URLJarFile.java:107) 
     at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:114) 
     at sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:132) 
     at java.net.URL.openStream(URL.java:1010) 
     at javax.xml.xpath.SecuritySupport$4.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.xml.xpath.SecuritySupport.getURLInputStream(Unknown Source) 
     at javax.xml.xpath.XPathFactoryFinder._newFactory(Unknown Source) 
     at javax.xml.xpath.XPathFactoryFinder.newFactory(Unknown Source) 
     at javax.xml.xpath.XPathFactory.newInstance(Unknown Source) 
     at javax.xml.xpath.XPathFactory.newInstance(Unknown Source) 

zipfile एक देशी कॉल (zlib करने के लिए मेरा मानना ​​है कि) बनाता है और जार, जो डिस्क की जरूरत है decompresses आईओ और प्रोसेसर बाध्य ज़िप डिकंप्रेशन। इस उदाहरण में हमारे पास उस लॉक पर 1400+ धागे इंतजार कर रहे थे।