문제

게 만들 필요가 ArrayList 의 ArrayLists 스레드에 안전합니다.또한할 수 없는 항목은 오류를 발생한 클라이언트의 변경합니다.이 수정할 수 없는 래퍼들에게 그것은 스레드에 안전하거나 필요합니까 두 개의 포장지에서 컬렉션을 아시나요?

도움이 되었습니까?

해결책

그것에 따라 다릅니다.래퍼만 변경을 방지하기 위해 컬렉션 그 랩,하지 않는 객체에서 컬렉션입니다.이 있는 경우 ArrayList 의 ArrayLists,글로벌 목록뿐만 아니라 각각의 요소 목록에 포장해야 별도로 있을 수도 있습을 위해 무언가를 하는 내용의 사람들 목록입니다.마지막으로,당신은 당신이 있는지 확인해야는 원래 목록에 객체를 변경하지 않기 때문에,래퍼만을 변경하지 못하게 합니다 래퍼를 통해 참고하는 원래의 개체입니다.

당신이 필요하지 않습 동기화 wrapper 이 경우.

다른 팁

에 관련된 항목-봤어요 몇 가지 응답이 제안을 사용하여 동기화 모음을 달성하기 위해서 스레드에 안전합니다.를 사용하여 동기화 버전의 컬렉션을 만들지 않다"스레드에 안전하"-지만 작업(삽입,수 etc.) 에 의해 보호됩 mutex 를 결합 할 때 두 가지 작업에는 보장은 없는 그들은 자동으로 실행.예를 들어,다음 코드에 스레드를 안전(도 함께 동기화된 큐):

if(queue.Count > 0)
{
   queue.Add(...);
}

의 수정할 수 없는 래퍼로만의 변경을 방지 구조물의 목록을 적용됩니다.이 목록에 포함되는 다른 나열하고 있는 스레드 수정하려고 하는 이러한 중첩된 목록,다음은 보호되지 않습에 대하여 동시 수정을 위험이 있습니다.

에서 컬렉션에서 보 원본,그것은 다음과 같 수정할 수 없는 그것이 동기화됩니다.

static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
                 implements Set<E>, Serializable;

static class UnmodifiableCollection<E> implements Collection<E>, Serializable;

동기화된 클래스는 래퍼는 mutex 체에서 작업을 수행하도록 동기화된 부분은,그래서 필요할 것 같아요 모두 사용하여 모두를 얻을.또는 자신의 롤!

내가 믿기 때문에 UnmodifiableList 래퍼가 매장 ArrayList 최종 필드를 읽는 방법에는 래퍼 목록이 표시됩 경우와 같이 wrapper 건설되었으로 목록되지 않을 수정한 후에는 래퍼가 만들어지고 만큼 변경 가능 ArrayLists 내부 래퍼용되지 않습니다.(이는 래퍼할 수 있는지에 대한 보호).

그것은 것이 스레드에 안전 경우 수정할 수 없는 뷰가 안전하게 출판하고,수정할 수 있는 원가 절대로 수정(를 포함하여 모든 개체가 재귀적으로 컬렉션에 포함된!) 게시 후 수정할 수 없 보기입니다.

을 유지하려는 경우 수정을 원할 수 있습을 만들거나 방어의 사본의 개체 그래프 컬렉션을 수정할 수 없게 반환기의 것을 사용하거나 본질적으로 스레드에 안전한 목록을 시작으로 돌아와는 수정할 수 없게 보입니다.

당신 할 수 없 환 unmodifiableList(synchonizedList(목록))는 경우 당신은 여전히 액세스하려는 목록 동기화되지 않은 나는 경우 변경 가능한 상태를 공유 사이에 여러 스레드,다음 모든 스레드 동기화해야에 잠금 장치에 액세스할 때는 상태입니다.

변경할 수 없는 객체에 의해 정의 스레드를 안전(가정 하나에 대한 참조를 유지합이 원래 모음),그래서 동기화 필요합니다.

포장 외부 ArrayList 를 사용하여 컬렉션이 있습니다.unmodifiableList() 을 방지하는 클라이언트에서 그 내용을 변경하(며,따라서 그것은 스레드 안전),그러나 안 ArrayLists 은 여전히 변경할 수 있습니다.

포장 내 ArrayLists 를 사용하여 컬렉션이 있습니다.unmodifiableList()도 을 방지하는 클라이언트에서 변경 내용(고,따라서 그들을 스레드에 안전),무엇이 당신이 필요합니다.

우리가 알고 있는 경우에는 이 솔루션 문제를 일으키(오버헤드 메모리 사용량 etc.);다른 솔루션을 적용할 수 있습니다 당신의 문제입니다.:)

편집:의 경우 물론,이러한 목록은 수정하지 않은 스레드에 안전합니다.나는 가정이 더 편집 내용을 만들 수 있다.

가 확실하지 않으면 내가 무엇인지 이해하려고 하지만,나는 말로 대답은"아니오".

당신이 설정 ArrayList ArrayList 의고,모두 외부와 내부에 목록을 변경되지 않을 수 있습니다 후에는 창조(동안 창조는 단 하나의 스레드에 액세스하거나 내부 및 외부 목록),그들은 아마 쓰레드에 안전하에 의해 래퍼(는 경우,외부 및 내부 목록에 싸서 그런 방법으로 수정하는 것은 불가능).모두 읽기 전용 작업에 ArrayLists 가능성이 가장 높은 스레드에 안전합니다.그러나지 않는다 그들이 스레드에 안전(도에 대한 읽기 전용 운영),그래서 비록 그것이 작동할 수 있는 지금,그것은 휴식이 미래에(있다면 태양의 일부를 생성한 내부에 캐싱의 데이터에 대한 빠른 액세스 예를 들어).

이것은 필요한 경우:

  1. 거기에 여전히 원래의 참조의 수정할 수 있는 목록이다.
  2. 목록이 가능하게 액세스할지만 반복기입니다.

하려면에서 읽 ArrayList 여 인덱스를 이은 스레드에 안전합니다.

면 의심에,선택한 동기화 래퍼입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top