¿Cómo uso XPath de una manera segura para los subprocesos y eficiente?

Davids:

(Una pregunta similar se ha pedido aquí, Java XPathFactory hilo de seguridad , pero la respuesta es incorrecta porque ignora el hecho de que la documentación indica que XPathFactory.newInstance()no es seguro para subprocesos.)

Desde el Javadoc XPathFactory , tenemos:

La clase XPathFactory no es seguro para subprocesos. En otras palabras, es la responsabilidad de la aplicación para asegurarse de que como máximo un hilo está utilizando un objeto XPathFactory en un momento dado. Las implementaciones se les anima a métodos marca como sincronizado para protegerse de los clientes rotos.

XPathFactory no es re-entrante. Mientras se invoca uno de los métodos newInstance, las aplicaciones no pueden tratar de forma recursiva invocar un método newInstance, incluso desde el mismo hilo.

Así que de la cita anterior, lo tomo que XPathFactory.newInstance()(un método estático) no debe ser llamado al mismo tiempo. No es seguro para subprocesos.

Los rendimientos de fábrica XPath objetos, los cuales tiene este XPath Javadoc :

Un objeto XPath no es hilo-seguro y no reentrante. En otras palabras, es la responsabilidad de la aplicación para asegurarse de que un objeto XPath no se utiliza desde más de un hilo en un momento dado, y mientras el evaluar se invoca el método, las aplicaciones no recursiva puede llamar al método de evaluación.

De la cita anterior, lo tomo que XPath.evaluatey XPathExpression.evaluateno debería ser llamado al mismo tiempo. No son seguros para subprocesos.

Normalmente, cuando estoy tratando con clases que no son seguros para subprocesos que sólo tiene que utilizar variables locales, sino porque XPathFactory.newInstance()no es seguro para subprocesos, y es un método estático, no estoy seguro de cómo utilizar de forma segura y eficiente. Creo que podría sincronizar las llamadas a newInstance, pero me preocupa el rendimiento, ya mi solicitud es un mensaje XML aplicación de enrutamiento. (En mis pruebas de humo de newInstanceque se necesita ~ 0,4 milisegundos.)

No puedo encontrar ningún ejemplo de utilización de Java XPath de una manera segura para los subprocesos, y no estoy seguro de que sé cómo usar XPath de una manera segura para los subprocesos, pero eficiente. También tengo la restricción de que necesito utilizar XPath dentro de un conjunto unitario (específicamente un procesador de Apache Camel ).

jaco0646:

Puedo entender que XPathFactory.newInstance()(un método estático) no debería ser llamado al mismo tiempo. No es seguro para subprocesos.

Dicha documentación se puede interpretar de manera diferente: hilo de seguridad y de reentrada son atributos distintos, por lo que es posible para XPathFactory.newInstance()estar seguro para subprocesos todavía no reentrante. La palabra de forma recursiva parece clave; pero la estructura de la oración es difícil de analizar. Sin revisar el código en detalle, la sincronización de alrededor de cualquier newInstancellamadas parece la única forma segura de usarlos. Tenga en cuenta que Java 9 añadido el newDefaultInstancemétodo, que parece trivial seguro para subprocesos.

Puedo entender que XPath.evaluatey XPathExpression.evaluateno debería ser llamado al mismo tiempo. No son seguros para subprocesos.

Convenido. La documentación indica claramente estos métodos no son ni flujos seguros ni de reentrada.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=184281&siteId=1
Recomendado
Clasificación