2015-01-15 7 views
2

콜렉션의 데이터 가시성과 관련하여 동시 콜렉션 (예 : ConcurrentMap)에서 기대할 수있는 것에 대해 약간의 확신이 없습니다.Java 동시 콜렉션 및 가시성

A : Thread1은 복잡한 개체를 넣고 Thread2는 가져옵니다. Thread2에서는 모든 속성을 볼 수 있습니까?

B : Thread1은 복잡한 개체를 넣은 다음 나중에 일부 특성을 변경합니다. 그런 다음 Thread2가 가져 오면 모든 변경 사항이 Thread2에 표시됩니까?

B가 잘못된 것 같습니다. 그렇다면 복잡한 개체의 모든 액세스를 동기화해야합니까?

+0

구체적인 코드 예제를 제공해주십시오. –

+0

코드는 어디에 있습니까? –

+0

복잡한 객체의 멤버에 대해 getter 및 setter를 동기화해야합니다. –

답변

2

A : 개체가 변경 가능하지 않거나 개체가 변경 가능하지만 모든 속성이 보다 작 으면 전에 개체가 컬렉션에 추가 된 다음 모든 개체가 표시됩니다. B : 동기화 메커니즘이 없다면 스레드 2가 개체에 액세스 할 때 달라집니다.

이러한 종류의 동작이 보장되어야하는 경우 (즉, 읽기 스레드가 mutator 스레드에서 트랜잭션 방식으로 변경 한 사항을 모두 볼 수 있도록 보장해야 함) 세마포어 메커니즘을 설정하는 것이 좋습니다. 더 좋은 것은, 당신이 불변의 객체를 사용한다면 더 간단 할 것이다.

3

동시 수집으로 푸시하는 것은이를 게시하는 것으로 정의됩니다. 패키지 설명에서 "Memory Consistency Properties"을 참조하십시오.

즉, 저장된 개체를 변경하는 경우 자동으로 관계가 발생하지 않습니다. 변경 사항을 동 기화/변동 또는 동시 프리미티브 자체를 사용해야합니다.