Get 작업은 기본 배열이나 연결 목록을 변경하지 않습니다. 원래 포스터의 질문은 Get 중에 다른 스레드가 동시에 넣거나 Get 중에 다른 스레드가 동시에 제거된다는 것일 수 있습니다. 실제로 여기서는 문제가 없습니다. get이 앞에 있고 put이 뒤에 있으면 null을 얻게 됩니다. get 이후에 제거가 앞에 있으면 null도 얻게 됩니다. 먼저 넣으면 null이 생기고, 먼저 제거하면 obj가 나오는 상황은 없습니다. 제거 또는 넣기의 최종 작업은 원자 설정 세그먼트[i].table[j]이기 때문에 가져오기 작업은 이 작업을 망칠 가능성이 없습니다
내부 구현에서는 잠금을 사용하므로 사용할 때 다른 잠금 계층을 추가할 필요가 없습니다
으아아아2/3. 쓰기가 완료되지 않은 상태에서 읽으면 null을 읽게 됩니다. 이때 쓰기 작업으로 인해 잠금이 해제될 때까지 기다렸다가 다시 읽습니다.
get
잠그지 않아도 됩니다. 읽기만 하면 데이터가 변경되지 않습니다.readValueUnderLock
정상적인 조건은 실행되지 않습니다e.value
은null
에 사용되지 않습니다. 저자Doug Lea
는 다음과 같이 설명합니다jdk 상위 버전에서는
ConncurrentHashMap
이 완전히 다시 작성되어 이 부분의 코드가 사라졌습니다.ConncurrentHashMap은 jdk5에서 도입되었습니다. 자체 작동으로 스레드 안전성이 보장되므로 잠글 필요가 없습니다
클래식 읽기 및 쓰기 모델, 일반적으로 읽기에 잠금이 필요하지 않습니다
Get 작업은 기본 배열이나 연결 목록을 변경하지 않습니다. 원래 포스터의 질문은 Get 중에 다른 스레드가 동시에 넣거나 Get 중에 다른 스레드가 동시에 제거된다는 것일 수 있습니다. 실제로 여기서는 문제가 없습니다. get이 앞에 있고 put이 뒤에 있으면 null을 얻게 됩니다. get 이후에 제거가 앞에 있으면 null도 얻게 됩니다. 먼저 넣으면 null이 생기고, 먼저 제거하면 obj가 나오는 상황은 없습니다. 제거 또는 넣기의 최종 작업은 원자 설정 세그먼트[i].table[j]이기 때문에 가져오기 작업은 이 작업을 망칠 가능성이 없습니다