2015-01-25 2 views
0

의심되는 점은 HashTable get() 메서드가 읽기 위해 동기화된다는 것입니다. 그러나이 제한은 ConcurrentHashMap에서 제거되었습니다. 그러나 동기화 된 블록 만 메모리의 최신 값에 액세스합니다. 만약 다른 스레드가 그것을 업데이트 한 다음 그 값을 로컬에 캐싱하면 케이스가 최신 값에 액세스합니다. Hows는 이렇게합니다. 추가 재진입 잠금은 동기화 된 블록과 같은 메모리에서 최신 값을 가져오고 업데이트합니다. 감사ConcurrentHashMap의 스레드 메모리 관리

+0

기본적으로 java.util.concurrent 라이브러리가 메모리 일관성 보장을 제공하는지 여부는 질문입니까? –

+0

예. 그것은 어리석게 들릴지도 모른다. 하지만 어디서나 읽지는 않았습니다. 그럼 그냥 확인해. – HariJustForFun

+0

인터페이스에 대한 javadoc을 확인하십시오. ConcurrentMap – lbalazscs

답변

1

ConcurrentHashMap를위한 Javadoc이 꽤 분명하다

취득에서는 자신의 발병에 잡고 작업을 위해 가장 최근에 완료 한 업데이트의 결과를 반영합니다. (더 공식적으로, 주어진 키에 대한 업데이 트 작업을 맺는 일이 발생-전에 업데이트 된 값을보고 해당 키에 대한 모든 (null 이외의) 검색과 관계를.)

을 "이 발생-전에"텍스트 특히 java memory consistency의 동작을 나타냅니다.

+0

감사합니다. 또한 요점은 읽기 작업을 동기화하거나 잠그지 않고 어떻게 최신 값을 가져올 수 있는지입니다. 내부적으로 사용되는 메커니즘이 무엇인지 의미합니다. – HariJustForFun

+1

@HariJustForFun 소스가 JDK에 포함되어 있으므로이를 학습 할 수 있습니다. –

1

그러나 단지 동기화 블록이 당신이 잘못

메모리

의 최신 값에 액세스 : volatile없이 잠금과 최신 값에 액세스 읽습니다. 보다 일반적인 용어로, Java 메모리 모델에 의해 정의 된 관계가 쓰기와 읽기 사이에 설정되기 전에 이 발생하는지 여부가 중요한 관심사입니다. ConcurrentHashMap을 보장하기 위해 volatile 개의 변수를 사용하면 전에 발생합니다.

+0

그건 오타였습니다. 내가 의미했던 바는 동기화와 동기가 없음을 의미했습니다. 하지만 답변에 많은 감사드립니다. 말이된다. – HariJustForFun