J'ai une fonction qui utilise Pattern#compile
et a Matcher
pour rechercher une liste de chaînes pour un motif.
Cette fonction est utilisée dans plusieurs threads. Chaque thread aura un modèle unique transmis au Pattern#compile
lorsque le thread est créé. Le nombre de threads et de modèles est dynamique, ce qui signifie que je peux ajouter plus de Pattern
threads et de threads pendant la configuration.
Dois-je mettre un synchronize
sur cette fonction si elle utilise regex? Est-ce que regex dans les threads Java est sûr?
compile()
méthode peut ne pas l'être. Il y a eu deux ou trois bogues au fil des ans qui ont provoqué l'échec de la compilation dans les environnements multithread. Je recommanderais de faire la compilation dans un bloc synchronisé.Sécurité des threads avec des expressions régulières en Java
la source
Même si vous devez vous rappeler que la sécurité des threads doit également prendre en compte le code environnant, vous semblez avoir de la chance. Le fait que les Matchers soient créés à l'aide de la méthode de fabrique matcher du Pattern et qu'ils manquent de constructeurs publics est un signe positif. De même, vous utilisez la méthode statique de compilation pour créer le modèle englobant .
Donc, en bref, si vous faites quelque chose comme l'exemple:
vous devriez vous débrouiller plutôt bien.
Suivi de l'exemple de code pour plus de clarté: notez que cet exemple implique fortement que le Matcher ainsi créé est thread-local avec le Pattern et le test. Par exemple, vous ne devez pas exposer le Matcher ainsi créé à d'autres threads.
Franchement, c'est le risque de toute question de sécurité des threads. La réalité est que tout code peut être rendu non sûr pour les threads si vous essayez assez fort. Heureusement, il existe de merveilleux livres qui nous apprennent tout un tas de façons de ruiner notre code. Si nous restons à l'écart de ces erreurs, nous réduisons considérablement notre propre probabilité de problèmes de threading.
la source
Un rapide coup d'œil au code pour
Matcher.java
montre un tas de variables membres, y compris le texte qui est mis en correspondance, des tableaux pour les groupes, quelques index pour maintenir l'emplacement et quelquesboolean
s pour un autre état. Tout cela pointe vers un étatMatcher
qui ne se comporterait pas bien s'il était accédé par plusieursThreads
. Tout comme le JavaDoc :Ce n'est un problème que si, comme le souligne @Bob Cross, vous faites tout votre possible pour autoriser l'utilisation de votre
Matcher
dans desThread
s séparés . Si vous devez faire cela et que vous pensez que la synchronisation sera un problème pour votre code, une option que vous avez est d'utiliser unThreadLocal
objet de stockage pour maintenir unMatcher
thread de travail par thread.la source
Pour résumer, vous pouvez réutiliser (conserver dans des variables statiques) le (s) Pattern (s) compilé (s) et leur dire de vous donner de nouveaux Matchers en cas de besoin pour valider ces motifs regex par rapport à une chaîne
voir http://zoomicon.wordpress.com/2012/06/01/validating-e-mails-using-regular-expressions-in-java/ (vers la fin) concernant le modèle RegEx utilisé ci-dessus pour valider les e-mails ( au cas où cela ne correspond pas à vos besoins de validation par e-mail tel qu'il est affiché ici)
la source
static {}
? Vous pouvez intégrer cette initialisation de variable et créer lePattern
final
fichier.private static final Pattern emailPattern = Pattern.compile(EMAIL_PATTERN);
c'est mieux.