Tengo una función que usa Pattern#compile
y Matcher
para buscar un patrón en una lista de cadenas.
Esta función se utiliza en varios subprocesos. Cada hilo tendrá un patrón único que se le pasará Pattern#compile
cuando se cree el hilo. El número de subprocesos y patrones es dinámico, lo que significa que puedo agregar más Pattern
s y subprocesos durante la configuración.
¿Necesito poner una synchronize
en esta función si usa expresiones regulares? ¿Es seguro el regex en Java thread?
compile()
método no lo sea. Ha habido dos o tres errores a lo largo de los años que provocaron fallas en la compilación en entornos multiproceso. Recomendaría hacer la compilación en un bloque sincronizado.Seguridad de subprocesos con expresiones regulares en Java
fuente
Si bien debe recordar que la seguridad de los subprocesos también debe tener en cuenta el código circundante, parece que tiene suerte. El hecho de que los Matchers se creen utilizando el método de fábrica de Matcher de Pattern y carezcan de constructores públicos es una señal positiva. Asimismo, utiliza el método estático de compilación para crear el patrón que lo abarca .
Entonces, en resumen, si haces algo como el ejemplo:
deberías estar haciéndolo bastante bien.
Siga el ejemplo de código para mayor claridad: tenga en cuenta que este ejemplo implica fuertemente que el Matcher así creado es local de subproceso con el Patrón y la prueba. Es decir, no debe exponer el Matcher así creado a ningún otro hilo.
Francamente, ese es el riesgo de cualquier pregunta de seguridad de subprocesos. La realidad es que cualquier código puede convertirse en subproceso inseguro si se esfuerza lo suficiente. Afortunadamente, hay libros maravillosos que nos enseñan un montón de formas en las que podríamos arruinar nuestro código. Si nos mantenemos alejados de esos errores, reducimos en gran medida nuestra propia probabilidad de enhebrar problemas.
fuente
Un vistazo rápido al código
Matcher.java
muestra un montón de variables miembro, incluido el texto que se está comparando, matrices para grupos, algunos índices para mantener la ubicación y algunosboolean
s para otro estado. Todo esto apunta a un estadoMatcher
que no se comportaría bien si varios usuarios acceden a élThreads
. También lo hace JavaDoc :Esto solo es un problema si, como señala @Bob Cross, se esfuerza por permitir el uso de sus correos electrónicos
Matcher
separadosThread
. Si necesita hacer esto, y cree que la sincronización será un problema para su código, una opción que tiene es utilizar unThreadLocal
objeto de almacenamiento para mantener unMatcher
hilo de trabajo por.fuente
En resumen, puede reutilizar (mantener en variables estáticas) los patrones compilados y decirles que le proporcionen nuevos Matchers cuando sea necesario para validar esos patrones de expresiones regulares con alguna cadena
consulte http://zoomicon.wordpress.com/2012/06/01/validating-e-mails-using-regular-expressions-in-java/ (cerca del final) con respecto al patrón de RegEx utilizado anteriormente para validar correos electrónicos ( en caso de que no se ajuste a sus necesidades de validación de correo electrónico como se publica aquí)
fuente
static {}
? Puede alinear esa inicialización de variable y hacer elPattern
final
también.private static final Pattern emailPattern = Pattern.compile(EMAIL_PATTERN);
es mejor.