찾다

 >  Q&A  >  본문

java - ConcurrentHashMap的get为什么可以不加锁?

ringa_leeringa_lee2802일 전833

모든 응답(5)나는 대답할 것이다

  • 阿神

    阿神2017-04-18 10:08:21

    1. 내부 구현에서는 잠금을 사용하므로 사용할 때 다른 잠금 계층을 추가할 필요가 없습니다

      으아아아

      2/3. 쓰기가 완료되지 않은 상태에서 읽으면 null을 읽게 됩니다. 이때 쓰기 작업으로 인해 잠금이 해제될 때까지 기다렸다가 다시 읽습니다.

    회신하다
    0
  • 阿神

    阿神2017-04-18 10:08:21

    1. get 잠그지 않아도 됩니다. 읽기만 하면 데이터가 변경되지 않습니다.

    2. readValueUnderLock 정상적인 조건은 실행되지 않습니다

    3. e.valuenull에 사용되지 않습니다. 저자 Doug Lea는 다음과 같이 설명합니다

    으아아아

    jdk 상위 버전에서는 ConncurrentHashMap이 완전히 다시 작성되어 이 부분의 코드가 사라졌습니다.

    회신하다
    0
  • 黄舟

    黄舟2017-04-18 10:08:21

    ConncurrentHashMap은 jdk5에서 도입되었습니다. 자체 작동으로 스레드 안전성이 보장되므로 잠글 필요가 없습니다

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:08:21

    클래식 읽기 및 쓰기 모델, 일반적으로 읽기에 잠금이 필요하지 않습니다

    회신하다
    0
  • PHPz

    PHPz2017-04-18 10:08:21

    Get 작업은 기본 배열이나 연결 목록을 변경하지 않습니다. 원래 포스터의 질문은 Get 중에 다른 스레드가 동시에 넣거나 Get 중에 다른 스레드가 동시에 제거된다는 것일 수 있습니다. 실제로 여기서는 문제가 없습니다. get이 앞에 있고 put이 뒤에 있으면 null을 얻게 됩니다. get 이후에 제거가 앞에 있으면 null도 얻게 됩니다. 먼저 넣으면 null이 생기고, 먼저 제거하면 obj가 나오는 상황은 없습니다. 제거 또는 넣기의 최종 작업은 원자 설정 세그먼트[i].table[j]이기 때문에 가져오기 작업은 이 작업을 망칠 가능성이 없습니다

    회신하다
    0
  • 취소회신하다