2014-10-16 8 views
2

필자는 EnumSet을 가지고 있으며 이것은 최종적이며 생성자에서 한 번 초기화되지 않는다.읽기 전용 EnumSet 반복자 스레드가 안전합니까?

EnumSet에 대한 방법은 안전합니까? contains 체크를하기 위해서 내부적으로 iterator를 사용하고있다. 따라서 두 스레드가 동시에 을 호출하는 경우 하나의 호출에서 이터레이터 위치를 다른 호출에 적용 할 수 있습니까? 또는이 두 스레드 호출에서 반복자가 다른 인스턴스를 갖고 있습니까?

답변

0

아니요. 두 스레드가 동시에 을 호출하면 iterator()이 두 번 호출되어 별도의 반복기가 만들어집니다.

두 스레드간에 반복자를 공유하려는 경우 이 좋지 않습니다. 다른에 걸쳐 (예를 통해를 contains) 반복하는 동안 하나 개의 스레드에서 설정을 수정하는 경우, 그 문서의이 비트가 활동하기 시작하는 것을

참고 :

반환 된 반복자는 약 일관성이다 : 그것은 ConcurrentModificationException는 결코 throw되지 않고 반복이 진행되는 동안 발생하는 세트에 대한 수정의 영향을 표시하거나 표시하지 않을 수 있습니다.

1

내용 EnumSet는 마지막으로 인 참조에도 변경 될 수있다. 아니요 EnumSet은 변경할 수 없습니다. 그러나 EnumSetCollections.unmodifiableSet()으로 포장 할 수 있습니다. 원래 EnumSet에 대한 참조를 유지하지 않으려면 수정 불가능한 랩퍼 오브젝트가 기능적으로 변경 불가능합니다.

에도 불구하고, 동일한 Set에서 작동하는 두 개의 반복기는 Set이 수정되지 않는 한 아무런 문제가 없습니다. 이것은 단지 하나의 반복자의 경우와 전혀 다른 것은 아닙니다.

어쨌든 EnumSet의 메서드는 반복기를 만들거나 사용하지 않습니다. 이 클래스는 비트 벡터를 통해 멤버십을 구현하므로 비트 작업을 사용하여 테스트를 수행합니다.