Java Regex 스레드는 안전한가요?
이능 that that that that를 하는 기능이 .Pattern#compile
a. a. a.Matcher
문자열 목록에서 패턴을 검색합니다.
이 함수는 여러 스레드에서 사용됩니다.한 패턴을 .Pattern#compile
스레드가 생성되었을 때.에 더 많이 수 .Pattern
을 사용하다
★★★★★★★★★★★★★★★★★★★★★★★★★★를 넣어야 하나요?synchronize
regex를 사용하는 이 에 대해 합니다.Java "regex" "regex" "regex"?
예, 패턴 클래스에 대한 Java API 문서에서 확인했습니다.
이 (Pattern) 클래스의 인스턴스는 불변하며 여러 개의 동시 스레드에서 사용해도 안전합니다.Matcher 클래스의 인스턴스는 이러한 용도로 안전하지 않습니다.
퍼포먼스 중심 코드를 참조할 경우 새 인스턴스를 작성하는 대신 reset() 메서드를 사용하여 Matcher 인스턴스를 리셋해 보십시오.그러면 Matcher 인스턴스의 상태가 리셋되어 다음 regex 작업에 사용할 수 있게 됩니다.실제로 동시 액세스에 안전하지 않은 것은 Matcher 인스턴스에서 유지되는 상태입니다.
요약:.
Java 정규 표현 API는 하나의 컴파일된 패턴을 여러 일치 조작으로 공유할 수 있도록 설계되었습니다.
다른 스레드에서 같은 패턴으로 Pattern.matcher()를 안전하게 호출하여 동시에 안전하게 사용할 수 있습니다.pattern.matcher()는 동기 없이 매처를 구축하는 것이 안전합니다.메서드는 동기화되지 않지만 패턴클래스 내부에서는 compiled라는 휘발성 변수가 항상 패턴을 구축한 후 설정되며 matcher() 호출 시작 시 읽힙니다.이렇게 하면 패턴을 참조하는 스레드가 해당 개체의 내용을 올바르게 "표시"합니다.
한편, 다른 스레드 간에 매처를 공유해서는 안 됩니다.또는 적어도 명시적 동기화를 사용해야 합니다.
스레드 안전은 주변 코드도 고려해야 한다는 점을 기억해야 하지만 운이 좋은 것 같습니다.Matchers는 Pattern의 Matcher Factory 방식으로 생성되고 퍼블릭 컨스트럭터가 부족하다는 것은 긍정적인 신호입니다.마찬가지로 컴파일 스태틱 방식을 사용하여 포괄적 패턴을 만듭니다.
즉, 예를 들어 다음과 같은 작업을 수행할 수 있습니다.
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
꽤 잘 하고 있을 거야
알기 쉽게 하기 위해 코드 예제의 후속 작업: 이 예제는 작성된 Matcher가 패턴 및 테스트와 함께 스레드 로컬임을 강하게 시사합니다.즉, 이렇게 작성된 매처를 다른 스레드에 노출하면 안 됩니다.
솔직히 말해서, 그것은 어떤 나사산 안전 질문의 위험입니다.현실은 당신이 충분히 노력한다면 어떤 코드도 스레드 비안전화 될 수 있다는 것이다.다행히도, 우리의 코드를 망칠 수 있는 많은 방법들을 가르쳐주는 훌륭한 책들이 있습니다.이러한 실수로부터 멀어진다면, 문제가 발생할 가능성을 크게 줄일 수 있습니다.
의 코드를 간단하게 참조해 주세요.Matcher.java
에 일치하는 텍스트, 그룹의 배열, 로케이션 유지보수를 위한 몇 가지 인덱스 및 몇 가지 멤버 변수를 나타냅니다.boolean
다른 상태일 경우이것은 모두 스테이트풀을 나타내고 있습니다.Matcher
여러 개에 의해 액세스되면 올바르게 동작하지 않습니다.Threads
JavaDoc도 마찬가지입니다.
이 클래스의 인스턴스는 여러 개의 동시 스레드에서 사용할 수 없습니다.
이 문제는 @Bob Cross가 지적한 바와 같이, 당신이 당신의 방식대로, 당신의 방식대로의 사용을 허용했을 때에만 발생합니다.Matcher
따로따로Thread
s. 이 작업을 수행해야 하는데 동기화가 코드에 문제가 된다고 생각되는 경우 스토리지 개체를 사용하여Matcher
작업 스레드당
요약하면 컴파일된 패턴을 재사용(정적 변수 유지)할 수 있으며, 일부 문자열에 대해 regex 패턴을 검증하기 위해 필요할 때 새로운 Matchers를 제공하도록 지시할 수 있습니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Validation helpers
*/
public final class Validators {
private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$";
private static Pattern email_pattern;
static {
email_pattern = Pattern.compile(EMAIL_PATTERN);
}
/**
* Check if e-mail is valid
*/
public static boolean isValidEmail(String email) {
Matcher matcher = email_pattern.matcher(email);
return matcher.matches();
}
}
E-메일 검증에 사용되는 RegEx 패턴에 대해서는, http://zoomicon.wordpress.com/2012/06/01/validating-e-mails-using-regular-expressions-in-java/(마지막 부근)을 참조해 주세요(이것이 여기에 게재되어 있는 E-메일 검증의 요구에 적합하지 않은 경우).
언급URL : https://stackoverflow.com/questions/1360113/is-java-regex-thread-safe
'source' 카테고리의 다른 글
Laravel 웅변 쿼리에서 200만 행까지 시간이 오래 걸린다 (0) | 2023.02.06 |
---|---|
다음과 같이 SQL 쿼리에서 SQL 테이블과 목록 간의 공통 값 찾기 (0) | 2023.02.06 |
항상 range()보다 xrange()를 선호합니까? (0) | 2023.02.06 |
MySQL에 Python datetime.datetime 개체 삽입 (0) | 2023.02.06 |
"접속 실패:php 함수의 'root'@'localhost' 사용자(암호: YES 사용)에 대한 액세스가 거부되었습니다. (0) | 2023.02.06 |