2013-12-22 2 views
5

반복하는 동안 동시 수정을 지원하는 List 인터페이스를 구현하는 컨테이너가 있습니까? 특히, 많은 스레드가이 목록에서 요소를 삽입하고 제거하는 동안 컬렉션을 반복하는 하나의 스레드가 필요합니다. 반복자는 아직 트래버스하지 않은 목록에 대한 수정을보아야합니다.반복하는 동안 동시 수정을 지원하는 목록 모음이 있습니까?

ConcurrentLinkedQueue와 비슷한 반복 동작을 찾고 있지만 특정 인덱스에서 요소를 추가 및 제거 할 수 있습니다. 가급적 강한 일관성 (그리고 그것을 위해 자물쇠 경합 오버 헤드를 지불 할 용의가 있음)을 찾고 있지만 약한 일관성으로 살 수 있습니다.

제가 찾고있는 것을 제공하는 표준 라이브러리에서 아무것도 볼 수 없으므로 써드 파티 라이브러리를 보게되어 기쁩니다.

+0

죄송 합니다만, 나는 이것이 오프 토픽이라고 인식하지 못했습니다. 의견을 청하는 것이 아니라 내 필요에 맞는 것이 있는지 찾아내는 것이 내 의도였습니다. –

답변

5

가까운 것이 있습니다. CopyOnWriteArrayList이라고합니다 - iterator가 iterating하는 동안 만들어진 변경 사항을 iterator가 보지 못한다는 제한이 있지만 iteration을 반복하는 대신 iteration을 반복 할 것입니다.

그 컬렉션은 쓰기에는 속도가 느리지 만 (읽기는 빠름) 이는 고려해야 할 또 다른 사항입니다.

jME3에는 더 빠르지 만 멀티 스레드 액세스를 지원하지 않는 SafeArrayListdoc here이라는 내부 모음이 있습니다. iterators 등으로부터의 액세스를 지원합니다 (그래서 여러 스레드에서 시도하고하지 않는 한리스트에서 객체를 반복 할 수 있고 동시에 그것들을 추가/제거 할 수 있습니다). 다시 반복자는 반복 될 때 변경 사항을 보지 않을 것이고, 원래 데이터를 계속 반복 할 것입니다.

동시 패키지는 도움이 될 수있는 여러 가지 다른 데이터 구조를 제공합니다.

다른 방법으로 목록에 표준 ArrayList, synchronize을 수정하여 읽고 색인을 사용하여 반복 할 수 있습니다. (즉, list.get(i)).

그래도 많은 경우가있을 것입니다. 예를 들어, 요소를 제거하면 다른 모든 요소를 ​​섞어서 해당 점을 지나간 반복기에서 하나를 건너 뜁니다.

실제로 반복기 목록을 유지해야 할 때와 요소를 추가/제거 할 때 반복기 목록을 반복하고 이에 따라 위치를 업데이트해야 할 수도 있습니다.

0

자바 API 만 사용하면 Collections.synchronizedList()을 사용하여 동기화 된 목록을 얻을 수 있습니다. 메소드의 스펙이 사용법에 적합한 지 확인하십시오. 그리고 ListIterator (List.listIterator() 메서드를 사용하여 얻음)을 사용하여 목록을 반복하고 수정합니다.

+0

그게 작동하지 않습니다, iterating 동안 수정에 대한 목록을 잠급니다. –

+0

그러나 쓰기를 위해 컬렉션을 잠그는 것이 여전히 괜찮은가요? – Neel

+0

그는 반복되는 동안 변경된 내용을 보는 반복자를 원합니다. 컬렉션이 잠겨 있으면 변경할 수 없습니다 ... –

관련 문제