2016-11-16 1 views
0

ArrayList<Foo>이 있다고 가정합니다. 이 목록은 매우 자주 수정됩니다. 목록의 요소 값에도 항상 변경되는 값이 있습니다. 이 목록에 대한 모든 수정은 주 스레드에 의해 수행됩니다.별도의 스레드에있는 객체의 Java 딥 복제 목록 원자 적으로

주 스레드 (또는 적어도 많지 않음)를 지연시키지 않는 방식으로 별도의 스레드에 목록 복제 (딥 레벨, 요소 또한 복제되어야 함) 및 복사 목록에는 원래의 목록과 동일한 값 (다시 한 번 스냅 샷)과 함께 모든 Foo 객체의 스냅 샷이 시간에 나타납니다 (기본적으로 원자 적이라고 생각합니다).

미리 감사드립니다. 솔루션은 동기화와 관련이 있지만 위의 모든 기준을 충족하지 못함을 알고 있습니다.

답변

1

불행히도이 간단한 대답은 없습니다. 목록에 대한 수정이 이미 스레드 세이프 (thread safe) 상태 인 경우 목록 (또는 동기화에 사용중인 모든 항목)에 대한 잠금을 잡고 사본을 만들고 잠금을 해제 할 수 있습니다. 항목 자체 수정시 동일한 잠금이 사용되는지 확인해야합니다.

또는 변경할 수없는 구문을 사용할 수도 있지만 (목록에는 포함되지 않지만 목록 내용에도 사용해야 함) 잠글 필요가 없으며 목록 사본을 가져올 수 있습니다 너의 여가 시간에.

두 가지 접근 방식에는 단점과 위험이 있습니다. 좋은 리소스를 원한다면 Java Concurrency in Practice을 강력히 추천합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 비록 저를 올바른 길로 인도하기위한 어떤 종류의 예를 찾고 있었지만 책에 대한 링크는 아닙니다. – olta8

+0

CopyOnWriteArrayList는 매우 잘 작동하는 것 같습니다. – olta8

+0

CopyOnWriteArrayList는 확실히 유용하지만 항목 자체를 수정하는 데주의해야합니다 (예 : CopyOnWriteArrayList의 코드 ). 거기에 십자가 문제에서 당신을 구해주지 않을 것입니다 ... –

관련 문제