Java MessageFormat 클래스 스레드는 안전합니까?(SimpleDateFormat과 반대)
-
16-09-2020 - |
문제
SimpleDateFormat과 NumberFormat은 스레드로부터 안전하지 않다는 것을 알고 있습니다.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500
하지만 MessageFormat과 같은 다른 Format 클래스는 어떻습니까?
Fortify 360에서는 "MessageFormat.format(String, Object...)" 정적 메서드의 사용을 "Race Condition - Format Flaw" 문제로 표시하고 있지만 MessageFormat의 소스 코드를 분석할 때 해당 메서드에서 이를 확인했습니다. , MessageFormat 자체의 새로운 로컬 인스턴스를 생성합니다.
Java MessageFormat 클래스 스레드는 안전합니까?
해결책
the Javadoc MessageFormat
의 경우 :
메시지 형식이 동기화되지 않습니다. 별도의 것을 만드는 것이 좋습니다 각 스레드의 형식 인스턴스.만약 다중 스레드는 형식에 액세스합니다 동시에 동기화해야합니다 외부 적으로.
그래서 공식적으로, 아니오 - 스레드 안전이 아닙니다.
SimpleDateFormat
의 문서가 많이 똑같은 말을합니다.
이제, 문서 은 보수적 인 것입니다. 실제로는 여러 스레드에서 잘 작동하지만 위험의 가치가 없습니다.
다른 팁
방법을 참조하는 경우
public static String format(String pattern, Object... arguments)
.
이것은 Javadoc에 설명 된대로 형식을 수행하기 위해 새로운 MessageFormat을 만듭니다.
btw, 'simpleTreadFormat'타이틀에 재미있는 오타가 재미있는 오타가 있습니다 :)
javadoc에 따르면, MessageFormat
객체는 스레드로부터 안전하지 않습니다.당신은 사용할 수 있습니다 ThreadLocal
필요한 각 스레드에 대해 별도의 개체를 만듭니다.
ThreadLocal<MessageFormat> threadLocalMessageFormat =
new ThreadLocal<MessageFormat>() {
@Override
protected MessageFormat initialValue() {
return new MessageFormat(pattern);
}
};
그런 다음 사용할 수 있습니다 threadLocalMessageFormat.get()
얻기 위해 MessageFormat
현재 스레드에 대해.