ConcurrentHashMap 탐구
3992 단어 자바
Concurrent HashMap 은 스 레 드 가 안전 하고 성능 이 좋 은 Map 의 스 레 드 안전 실현 입 니 다.HashMap 에 비해 스 레 드 가 안전 합 니 다.HashTable 의 성능 비교 우 위 는 매우 뚜렷 합 니 다.그의 사용 은 매우 간단 하 다.여 기 는 주로 Concurrent HashMap 의 실현 원 리 를 탐구 하고 자 한다.여기 서 모두 알 아야 할 문제 가 있다.
이 몇 가지 문 제 를 가지 고 Concurrent Hash Map 의 소스 코드 를 분석 해 보 겠 습 니 다.
ConcurrentHashMap 정의
JDK 8(JDK 7 도 마찬가지)에서 Concurrent HashMap 의 정 의 는 다음 과 같다.
public class ConcurrentHashMap extends AbstractMap
implements ConcurrentMap, Serializable {
Concurrent HashMap 의 JDK 7 에서 의 실현
자바 7 에서 Concurrent HashMap 의 실현 은 세그먼트 잠 금 을 바탕 으로 이 루어 졌 다.그의 바 텀 데이터 구 조 는 아직도 배열+링크 로 Hash Table 과 달리 Concurrent Hash Map 의 가장 바깥쪽 은 큰 배열 이 아니 라 Segment 배열(세그먼트 잠 금 의 실현)이다.세그먼트 자 물 쇠 는 자물쇠 의 입 도 를 줄 여 병발 정 도 를 높 였 다.해시 테이블 보다 효율 성 이 높 은 이유 다.HashTable 의 소스 코드 는 매우 간단 합 니 다.HashTable 과 HashMap 의 구조 가 일치 하지만 모든 방법 은 Synchronized 로 수식 하여 작업 이 안전 하도록 합 니 다.이렇게 다 중 스 레 드 의 경우 잠 금 동작 hashTable 의 데 이 터 를 가 져 오 는 스 레 드 만 있 습 니 다.Courrent HashMap 은 아니 며,최대 segment 배열 길이 의 스 레 드 가 Concurrent HashMap 의 데 이 터 를 동시에 조작 할 수 있 습 니 다.
Concurrent HashMap 의 전체 구 조 는 다음 과 같다(그림 출처:http://www.jasongj.com/java/c...):
Concurrent HashMap 의 정의:
public class ConcurrentHashMap extends AbstractMap
implements ConcurrentMap, Serializable {
private static final long serialVersionUID = 7249069246763182397L;
/**
*
*/
static final int DEFAULT_INITIAL_CAPACITY = 16;
/**
*
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;
/**
* segments , segments , segments 2 N
*/
static final int DEFAULT_CONCURRENCY_LEVEL = 16;
/**
* HashEntry
*/
static final int MAXIMUM_CAPACITY = 1 << 30;
/**
* segment
*/
static final int MIN_SEGMENT_TABLE_CAPACITY = 2;
/**
* segment
*/
static final int MAX_SEGMENTS = 1 << 16; // slightly conservative
/**
* ,
*/
static final int RETRIES_BEFORE_LOCK = 2;
/**
* , ssize-1
*/
final int segmentMask;
/**
* , 32-sshift
*/
final int segmentShift;
/**
* segment
*/
final Segment[] segments;
세그먼트 정의:
static final class Segment extends ReentrantLock implements Serializable {
transient volatile HashEntry[] table;
transient int count;
transient int modCount;
// , * , ,
transient int threshold;
//segment hashEntry
final float loadFactor;
}
Concurrent HashMap 의 JDK 8 에서 의 실현
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.