2013-09-05 2 views
1

여기에 ConcurrentHashMap에 키 값 쌍을 삽입하는 구현을 읽었습니다.concurrentHashmap의 put (key, value) 메소드의 아래 라인을 설명 하시겠습니까?

아래 내용은 이해할 수 없습니다.

int j = (hash >>> segmentShift) & segmentMask; 
     if ((s = (Segment<K,V>)UNSAFE.getObject   // nonvolatile; recheck 
      (segments, (j << SSHIFT) + SBASE)) == null) // in ensureSegment 
      s = ensureSegment(j); 
     return s.put(key, hash, value, false); 

누군가 설명하십시오.

+1

'<< "연산자가 무엇인지 묻고 있습니까? –

+0

'java.util.concurrent. * '를 작성한 사람들은이 세상에서 가장 밝은 사람들 중 한 명이라는 것을 읽었습니다. 나는 또한 그들 스스로가'동시 적'패키지가 어떤 경우에 어떻게 작동 하는지를 이해하지 못한다고 읽었다. 그게 무슨 대답입니까? – Shark

+0

나는 << 연산자를 안다. 그러나 만약 당신이 제 2 또는 제 3 라인에서 무엇을하려고하는지 단어로 설명 할 수 있다면. – Thinker

답변

1

메소드 호출 :

UNSAFE.getObject(segments, (j << SSHIFT) + SBASE) 

정상적인 배열 액세스 segments[j] 동등하지만 더 경계 검사를 필요로하지 않기 때문에 아마도 빠르다. SBASE은 배열 데이터가 segments 배열에서 시작되는 위치의 오프셋입니다. SSHIFT은 배열 인덱스 스케일의 로그 이므로 j << SSHIFT은 배열에서 인덱스 j의 원시 바이트 오프셋을 계산합니다.

관련 문제