2012-02-02 26 views
7

javax.xml.XPathFactory.newInstance() iş parçacığı güvenli midir?Java XPathFactory iş güvenliği

Bunu soruyorum çünkü bunun için belirsiz olan belgeleri buluyorum. The JDK 5 docs, iplik güvenliğini hiç bahsetmez;

XPathFactory sınıf evresel değildir: JDK 6 onlar takip yazdı. Diğer bir deyişle, herhangi bir anda en fazla bir iş parçacığının bir XPathFactory nesnesi kullanarak olduğundan emin olmak uygulamasının sorumluluğundadır. Uygulamaları, bozuk istemcilerden kendilerini korumak için senkronize olarak yöntemleri işaretlemek için teşvik edilen vardır.

Anladığım kadarıyla, bu XPathFactory için tekil uygulaması olması güvenli değil, ama böyle yaparak şey güvenli olmalıdır:

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

Ben bir şey eksik? Bu, onu genişleten gerçek sınıfa bağlı mı? Yukarıdaki ifadeyi içeren synchronize yöntemine ihtiyacım var mı?

cevap

11
XPath xPathEvaluator = XPathFactory.newInstance(). NewXPath(); Her iş parçacığı kendi fabrikasında ( newInstance() sayesinde) alır, çünkü güvenlidir

. Burada senkronizasyona gerek yok.

Güvenli bir şekilde yapamadığınız şey, fabrikayı yalnızca bir kez almak ve sonra senkronizasyon olmaksızın iş parçacıkları arasında paylaşmak, örneğin bir singleton. Aynı şey XPath örneğinin (xPathEvaluator) kendisi için de geçerlidir.

+0

Teşekkürler, aynısını düşünüyordum ama yeniden güvence istedim :). –

+1

Her zaman el ele tutuşur :-) – Thilo

+5

JAXP-XPath tasarımı hakkında birçok kötü şey var. Bunlardan biri XPathFactory.newInstance() çok pahalı; Bir diğeri, her iş parçasında tekrar tekrar çağırmanız bekleniyor. Bir diğeri, bir XPath 1.0 motorunu veya bir XPath 2.0 motorunu geri alıp almayacağınızı bilmenin bir yolu yoktur. Bu mekanizmayı gerçekten kullanmak isteyip istemediğinizi kendinize sorun: XPath motorunun ne istediğini biliyorsanız, yüklemek için daha iyi yollar vardır. –

3

"Bunlardan bir tanesi XPathFactory.newInstance() çok pahalı;"

Doğru beyan! Ben newInstance (çağırarak her iş parçacığı) için, jaxp.properties sınıf yolunda bulunması gerekir ve okumak fark:

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 (inanıyorum zlib kadar) bir yerli çağrı yapar ve diski ihtiyacı Kavanozu açar IO ve işlemci zip dekompresyonunu bağladı. Bu örnekte, bu kilitte bekleyen 1400'den fazla iş parçacığımız vardı.

İlgili konular