Mam funkcję, która używa Pattern#compile
i Matcher
do przeszukiwania listy ciągów dla wzorca.
Ta funkcja jest używana w wielu wątkach. Każdy wątek będzie miał unikalny wzór przekazany do, Pattern#compile
gdy zostanie utworzony. Liczba wątków i wzorców jest dynamiczna, co oznacza, że mogę dodać więcej Pattern
s i wątków podczas konfiguracji.
Czy muszę umieszczać synchronize
na tej funkcji, jeśli używa ona wyrażenia regularnego? Czy wyrażenie regularne w wątku Java jest bezpieczne?
compile()
metoda może nie być. Na przestrzeni lat pojawiły się dwa lub trzy błędy, które powodowały niepowodzenie kompilacji w środowiskach wielowątkowych. Poleciłbym kompilację w zsynchronizowanym bloku.Bezpieczeństwo wątków dzięki wyrażeniom regularnym w Javie
źródło
Chociaż musisz pamiętać, że bezpieczeństwo wątków musi również uwzględniać otaczający kod, wydaje się, że masz szczęście. Fakt, że dopasowujące są tworzone przy użyciu metody fabryki wzorców matcherów i brakuje publicznych konstruktorów, jest pozytywnym znakiem. Podobnie, używasz statycznej metody kompilacji , aby utworzyć obejmujący Pattern .
Krótko mówiąc, jeśli zrobisz coś takiego jak przykład:
powinieneś sobie dobrze radzić.
Kontynuuj przykładowy kod dla jasności: zwróć uwagę, że ten przykład silnie sugeruje, że utworzony w ten sposób element dopasowujący jest lokalny wątku ze wzorcem i testem. To znaczy, nie powinieneś ujawniać utworzonego w ten sposób Matchera żadnym innym wątkom.
Szczerze mówiąc, istnieje ryzyko jakichkolwiek pytań dotyczących bezpieczeństwa nici. W rzeczywistości każdy kod może stać się niebezpieczny dla wątków, jeśli wystarczająco się postarasz. Na szczęście istnieją wspaniałe książki, które uczą nas wielu sposobów zrujnowania naszego kodu. Jeśli trzymamy się z daleka od tych błędów, znacznie zmniejszamy własne prawdopodobieństwo problemów z gwintowaniem.
źródło
Szybkie spojrzenie na kod dla
Matcher.java
pokazuje kilka zmiennych składowych, w tym tekst, który jest dopasowywany, tablice dla grup, kilka indeksów dla utrzymania lokalizacji i kilkaboolean
dla innego stanu. To wszystko wskazuje na stanMatcher
, który nie zachowywałby się dobrze, gdyby był używany przez wiele osóbThreads
. Tak robi JavaDoc :Jest to problem tylko wtedy, gdy, jak wskazuje @Bob Cross, zrobisz wszystko, co w twojej mocy, aby zezwolić na korzystanie z
Matcher
oddzielnych plikówThread
. Jeśli musisz to zrobić i myślisz, że synchronizacja będzie problemem dla twojego kodu, możesz użyćThreadLocal
obiektu pamięci do obsługiMatcher
wątku roboczego.źródło
Podsumowując, możesz ponownie wykorzystać (zachować w zmiennych statycznych) skompilowany wzorzec (wzorce) i powiedzieć im, aby w razie potrzeby dali Ci nowe dopasowania, aby sprawdzić poprawność tych wzorów wyrażeń regularnych względem jakiegoś ciągu
zobacz http://zoomicon.wordpress.com/2012/06/01/validating-e-mails-using-regular-expressions-in-java/ (pod koniec) w sprawie wzorca RegEx używanego powyżej do sprawdzania poprawności wiadomości e-mail ( w przypadku, gdy nie odpowiada potrzebom weryfikacji wiadomości e-mail, jak jest to zamieszczone tutaj)
źródło
static {}
? Możesz wstawić tę zmienną inicjalizacyjną i zrobićPattern
final
również.private static final Pattern emailPattern = Pattern.compile(EMAIL_PATTERN);
jest lepszy.