Comparator의 단일 인스턴스를 만들면 해당 인스턴스를 Collections.sort()를 사용하여 컬렉션을 정렬하기 위해 여러 스레드에서 사용할 수 있습니까? 또는 스레드 안전성을 보장하기 위해 Collections.sort()를 호출 할 때마다 Comparator의 새 인스턴스를 만들어야합니까?Java에서 Collections.sort() 스레드 안전에 사용되는 Comparator는 무엇입니까?
17
A
답변
18
이는 전체적으로 Comparator
을 구현하는 방식에 따라 다릅니다. 예를 들어 비교할 때 내용이 변경되거나 내용이 암시 적으로 변경되는 인스턴스 변수가있는 경우 스레드 세이프가되지 않습니다.
대부분 Comparator
구현은 그러한 일을하지 않지만 합리적으로 발생할 수있는 시나리오는 SimpleDateFormat
을 사용하여 날짜를 나타내는 문자열을 비교하는 것입니다. 아쉽게도 SimpleDateFormat
그 자체는 스레드로부터 안전하지 않습니다.
5
비교기는 고유 한 동시성 속성이없는 인터페이스입니다. 구현이 쓰레드 세이프 (threadafe safe)인지 아닌지 여부는 쓰는 방법에 달려있다. 그것이하는 모든 것이 비교 메소드 (인스턴스 또는 클래스 레벨 상태 없음)의 범위에 국한되고 사용하는 모든 자원이 스레드 안전이면, 그 자체로 스레드 세이프가됩니다.
0
일반적으로 (항상?) 재진입이기 때문에 비 스레드 안전 Comparator를 발견하면 매우 놀랐습니다.
정렬이 발생하는 동안 정렬중인 컬렉션이 변경되는 경우 동시성 문제가 발생합니다.
스레드로부터 안전하지 않은 compare 메소드 내에서 리소스를 사용하는 것이 합리적입니다. 동기화되지 않은 콜렉션, 캘린더 등 편집 : 마이클 B가 말한 것^ – Affe
네 말이 맞아, 나는 그 사건들을 심사하지 않았다. – Artefacto