Ich habe eine Funktion, die verwendet Pattern#compile
und Matcher
eine Liste von Zeichenfolgen nach einem Muster durchsucht.
Diese Funktion wird in mehreren Threads verwendet. Jeder Thread hat ein eindeutiges Muster, das Pattern#compile
beim Erstellen des Threads übergeben wird. Die Anzahl der Threads und Muster ist dynamisch, was bedeutet, dass ich Pattern
während der Konfiguration weitere s und Threads hinzufügen kann .
Muss ich synchronize
diese Funktion aktivieren, wenn sie Regex verwendet? Ist Regex im Java-Thread sicher?
compile()
Methode jedoch möglicherweise nicht. Im Laufe der Jahre gab es zwei oder drei Fehler, die dazu führten, dass die Kompilierung in Multithread-Umgebungen fehlschlug. Ich würde empfehlen, die Kompilierung in einem synchronisierten Block durchzuführen.Thread-Sicherheit mit regulären Ausdrücken in Java
quelle
Während Sie sich daran erinnern müssen, dass die Thread-Sicherheit auch den umgebenden Code berücksichtigen muss, scheinen Sie Glück zu haben. Die Tatsache, dass Matcher mit der Matcher- Factory-Methode des Musters erstellt werden und keine öffentlichen Konstruktoren haben, ist ein positives Zeichen. Ebenso verwenden Sie die statische Kompilierungsmethode , um das umfassende Muster zu erstellen .
Kurz gesagt, wenn Sie so etwas wie das Beispiel machen:
du solltest es ziemlich gut machen.
Follow-up zum Codebeispiel zur Verdeutlichung: Beachten Sie, dass dieses Beispiel stark impliziert, dass der so erstellte Matcher mit dem Muster und dem Test threadlokal ist. Das heißt, Sie sollten den so erstellten Matcher keinem anderen Thread aussetzen.
Ehrlich gesagt, das ist das Risiko von Fragen zur Thread-Sicherheit. Die Realität ist, dass jeder Code threadsicher gemacht werden kann, wenn Sie sich genug anstrengen. Glücklicherweise gibt es wundervolle Bücher , die uns eine ganze Reihe von Möglichkeiten lehren, wie wir unseren Code ruinieren können. Wenn wir uns von diesen Fehlern fernhalten, reduzieren wir unsere eigene Wahrscheinlichkeit von Threading-Problemen erheblich.
quelle
Ein kurzer Blick auf den Code für
Matcher.java
zeigt eine Reihe von Mitgliedsvariablen, einschließlich des übereinstimmenden Texts, Arrays für Gruppen, einige Indizes zum Verwalten des Speicherorts und einigeboolean
s für andere Status. Dies alles deutet auf einen Zustand hinMatcher
, der sich nicht gut verhält, wenn mehrere darauf zugreifenThreads
. So auch das JavaDoc :Dies ist nur dann ein Problem, wenn Sie, wie @Bob Cross hervorhebt, alles daran setzen, Ihre Verwendung
Matcher
in separatenThread
s zuzulassen . Wenn Sie dies tun müssen und glauben, dass die Synchronisierung ein Problem für Ihren Code darstellt, können Sie einThreadLocal
Speicherobjekt verwenden, um einenMatcher
pro Arbeitsthread zu verwalten.quelle
Zusammenfassend lässt sich sagen, dass Sie die kompilierten Muster wiederverwenden (in statischen Variablen behalten) und ihnen mitteilen können, dass sie Ihnen bei Bedarf neue Matcher geben sollen, um diese Regex-Pattens anhand einer Zeichenfolge zu validieren
siehe http://zoomicon.wordpress.com/2012/06/01/validating-e-mails-using-regular-expressions-in-java/ (am Ende) in Bezug auf das Muster RegEx oben verwendete für die Validierung von E-Mail ( falls es nicht den Anforderungen für die E-Mail-Validierung entspricht, wie hier veröffentlicht)
quelle
static {}
? Sie können diese Variableninitialisierung einbinden undPattern
final
auch durchführen.private static final Pattern emailPattern = Pattern.compile(EMAIL_PATTERN);
ist besser.