2010-05-21 4 views

답변

18

이는 전체적으로 Comparator을 구현하는 방식에 따라 다릅니다. 예를 들어 비교할 때 내용이 변경되거나 내용이 암시 적으로 변경되는 인스턴스 변수가있는 경우 스레드 세이프가되지 않습니다.

대부분 Comparator 구현은 그러한 일을하지 않지만 합리적으로 발생할 수있는 시나리오는 SimpleDateFormat을 사용하여 날짜를 나타내는 문자열을 비교하는 것입니다. 아쉽게도 SimpleDateFormat 그 자체는 스레드로부터 안전하지 않습니다.

5

비교기는 고유 한 동시성 속성이없는 인터페이스입니다. 구현이 쓰레드 세이프 (threadafe safe)인지 아닌지 여부는 쓰는 방법에 달려있다. 그것이하는 모든 것이 비교 메소드 (인스턴스 또는 클래스 레벨 상태 없음)의 범위에 국한되고 사용하는 모든 자원이 스레드 안전이면, 그 자체로 스레드 세이프가됩니다.

0

일반적으로 (항상?) 재진입이기 때문에 비 스레드 안전 Comparator를 발견하면 매우 놀랐습니다.

정렬이 발생하는 동안 정렬중인 컬렉션이 변경되는 경우 동시성 문제가 발생합니다.

+2

스레드로부터 안전하지 않은 compare 메소드 내에서 리소스를 사용하는 것이 합리적입니다. 동기화되지 않은 콜렉션, 캘린더 등 편집 : 마이클 B가 말한 것^ – Affe

+1

네 말이 맞아, 나는 그 사건들을 심사하지 않았다. – Artefacto