2012-09-28 5 views
41

Java의 ConcurrentHashMap과 Hashtable의 차이점은 무엇입니까?Java의 ConcurrentHashMap 및 Hashtable

스레드 응용 프로그램에 더 효율적인 것은?

+0

도움이 될 수 있습니다 http://www.codercorp.com/blog/java/why-concurrenthashmap-is-better-than-hashtable-and-just-as-good-hashmap.html – kosa

+2

비 스레드 HashMap을 사용하십시오. –

+0

자세한 내용은 http://stackoverflow.com/a/40878/632951을 참조하십시오. – Pacerier

답변

68

ConcurrentHashMap은 여러 개의 버킷을 사용하여 데이터를 저장합니다. 이렇게하면 읽기 잠금이 방지되고 HashTable 이상의 성능이 크게 향상됩니다. 두 가지 모두 스레드로부터 안전하지만 ConcurrentHashMap과 함께 확실한 성능상의 이점이 있습니다. 당신이 get()를 사용하여 ConcurrentHashMap에서 읽을 때

는 모든 작업이 간단하게 동기화되는의 HashTable에 반하는 어떤 잠금이 없습니다. HashTable은 Java 이전 버전에서 출시되었지만 ConcurrentHashMap은 Java 5 이상 버전입니다.

HashMap은 단일 스레드 응용 프로그램에서 사용하는 것이 가장 좋습니다.

+10

또한'ConcurrentHashMap.putIfAbsent()'에는 이전' 해시 테이블'. 'ConcurrentHashMap' 만 읽으면, 모든 작업이 단순히 동기화되는'Hashtable '과는 달리 잠금이 없습니다. –

+0

@FrankPavageau가 원본 답변에 매우 유용한 의견을 추가했습니다. – Algorithmist

53

ConcurrentHashMap의 해시 테이블 및 잠금기구

  • Hashtable는 컬렉션 프레임 워크에 속한다; ConcurrentHashMap은 Executor 프레임 워크에 속합니다.
  • Hashtable은 전체 데이터의 경우단일 잠금을 사용합니다. ConcurrentHashMap은 객체 레벨 대신 세그먼트 레벨 (기본값 : 16) 인 복수 잠금을 사용합니다. 즉 전체 Map입니다.
  • ConcurrentHashMap 잠금은 업데이트에만 적용됩니다. 검색의 경우 완전 동시성을 허용하므로 검색은 가장 최근에 완료된 업데이트 작업의 결과를 반영합니다. 따라서 쓰기가 잠금으로 수행되는 동안 읽기가 매우 빠르게 발생할 수 있습니다.
  • ConcurrentHashMap 하나의 스레드가 스레드를 수정하려고 시도하고 다른 스레드가 스레드를 수정하려고 시도하고 null 값을 허용하지 않으면 ConcurrentModificationException을 던지지 않습니다.
  • ConcurrentHashMapIterator을 반환합니다. 이는 동시 수정시 오류 방지 (즉, 반복자가 내부 데이터 구조의 복사본을 만듭니다)입니다.
  • ConcurrentHashMap
  • 동시성 레벨라고도 데이터베이스 파편 로직 (Segment<K, V>[] segments)를 사용하여, 즉 Map (파편 (세그먼트)으로 데이터보다 대신 전체 데이터를 하나의 잠금을두고 각 샤드 (세그먼트)에 대한 잠금을두고 분할). 기본값은 16

  • 가정 다음 비유 당신은 단지 개념을 이해 얻을 수 있도록 도와이 link

    (하지 로직)에서 찾아보세요 더 기술적으로 ConcurrentHashMap의를 이해하는 것입니다 HashtableConcurrentHashMap은 두 가지 유형의 주택입니다.

  • Hashtable은 집의 주 문을 잠급니다.
  • ConcurrentHashMap은 주 문 대신 특정 방 문을 잠급니다.

스레드 응용 프로그램에 더 효율적입니까?

ConcurrentHashMap은 스레드 응용 프로그램에서 더 효율적입니다.

+0

위대한 대답 + 피터 – prayagupd

+0

매우 잘 설명 된 – RamBen

+2

예를 들어 모든 이론을 통해 승리 :) –