source

Java Regex 스레드는 안전한가요?

gigabyte 2023. 2. 6. 23:39
반응형

Java Regex 스레드는 안전한가요?

이능 that that that that를 하는 기능이 .Pattern#compile a. a. a.Matcher문자열 목록에서 패턴을 검색합니다.

이 함수는 여러 스레드에서 사용됩니다.한 패턴을 .Pattern#compile스레드가 생성되었을 때.에 더 많이 수 .Pattern을 사용하다

★★★★★★★★★★★★★★★★★★★★★★★★★★를 넣어야 하나요?synchronizeregex를 사용하는 이 에 대해 합니다.Java "regex" "regex" "regex"?

, 패턴 클래스에 대한 Java API 문서에서 확인했습니다.

이 (Pattern) 클래스의 인스턴스는 불변하며 여러 개의 동시 스레드에서 사용해도 안전합니다.Matcher 클래스의 인스턴스는 이러한 용도로 안전하지 않습니다.

퍼포먼스 중심 코드를 참조할 경우 새 인스턴스를 작성하는 대신 reset() 메서드를 사용하여 Matcher 인스턴스를 리셋해 보십시오.그러면 Matcher 인스턴스의 상태가 리셋되어 다음 regex 작업에 사용할 수 있게 됩니다.실제로 동시 액세스에 안전하지 않은 것은 Matcher 인스턴스에서 유지되는 상태입니다.

Java 정규식을 사용한 스레드 안전성

요약:.

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여러 개에 의해 액세스되면 올바르게 동작하지 않습니다.ThreadsJavaDoc도 마찬가지입니다.

이 클래스의 인스턴스는 여러 개의 동시 스레드에서 사용할 수 없습니다.

이 문제는 @Bob Cross가 지적한 바와 같이, 당신이 당신의 방식대로, 당신의 방식대로의 사용을 허용했을 때에만 발생합니다.Matcher따로따로Threads. 이 작업을 수행해야 하는데 동기화가 코드에 문제가 된다고 생각되는 경우 스토리지 개체를 사용하여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

반응형