문제

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 현재 스레드에 대해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top