Java에서 동시 해시 맵을 가장 잘 구현하는 방법은 무엇입니까?



이 기사에서는 Java의 Concurrent Hash Map이라는 개념을 소개하고 실용적인 데모를 따라갑니다.

이 기사에서는 Concurrent Hash Map In이라는 개념을 소개합니다. 실제 데모를 따라 가면이 기사에서 다음 사항을 다룰 것입니다.

Java의 동시 해시 맵에 대한이 기사로 이동





자바 예제에서 메소드 오버로딩 및 오버라이드

ConcurrentHashMap은 내부적으로 어떻게 작동합니까?

Java 5부터 ConcurrentHashMap은 HashTable의 대안으로 도입되었습니다. 동기화 된 맵 ()이라는 유틸리티 클래스 메서드를 사용하여 동기화 된 맵을 얻을 수도 있지만이 메서드에는 단점이 있습니다. 즉, 단일 스레드 만 한 번에 액세스 할 수 있기 때문에 성능이 매우 떨어집니다. 따라서 ConcurrentHashMap은 이러한 문제를 해결합니다.



Java의 동시 해시 맵에 대한이 기사로 이동

왜 다른지도?

이미 HashMap, HashTable이 있지만 ConcurrentHashMap이 필요한 것은 스레드로부터 안전함과 동시에 더 나은 성능을 제공하기 때문입니다.

Java의 동시 해시 맵에 대한이 기사로 이동



어떻게 다른가요?

또한 해싱을 기반으로하지만 잠금 전략으로 성능이 향상됩니다. HashTable 또는 Synchronized HashMap과 달리 각 메서드에 대해 동일한 잠금을 적용하지 않고 각 메서드에 대해 별도의 잠금을 사용하며이를 위해 재진입 잠금을 사용합니다. HashMap과 유사하게 ConcurrentHashMap에는 16 개 버킷, 즉 세그먼트가 있으며, 16 개 이상의 버킷으로 ConcurrentHashMap을 생성하기 위해 서로 다른 생성자가 있습니다.

자세히 이야기하기 전에 아래 몇 가지 개념을 검토해 보겠습니다.

ConcurrentHashMap :이 맵은 동시 스레드 액세스를 허용합니다. 맵을 추가하거나 업데이트하는 동안 세그먼트, 즉 기본 데이터 구조라는 맵의 일부만 잠 깁니다. 동시 스레드 액세스가 잠금없이 데이터를 읽을 수 있도록합니다. 성능 향상을 위해 도입되었습니다.

  • 동시성 수준 : 동시 업데이트 스레드의 예상 수입니다.
  • Load-Factor : 크기 조정 요소를 제어하는 ​​데 사용되는 값입니다.
  • 초기 용량 : 제공된 크기로 맵을 생성하는 속성입니다.

아래 다이어그램을보고 ConcurrentHashMap의 작동 방식을 이해해 보겠습니다.

이미지-동시 Hashmap- Edureka

따라서 위의 다이어그램에는 필요한 맵의 일부만 잠그는 16 개의 잠금이있어 다른 스레드에서 다른 메소드에 액세스 할 수 있으므로 성능이 향상됩니다.

HashMap과 유사하게 ConcurrentHashMap은 기본적으로 16 개의 세그먼트를 포함하고 해싱을 통해 요소를 저장하는 것과 유사한 방식으로 작동하므로 요소가 동일한 해시를 갖는 경우 링크 된 목록의 도움으로 위의 다이어그램에 표시된 것과 동일한 세그먼트에 저장됩니다.

Java의 동시 해시 맵에 대한이 기사로 이동

ConcurrentHashMap과 HashMap의 차이점

HashMap은 Collections에 속하고 ConcurrentHashMap은 Concurrent Collections에 속하지만 다른 많은 차이점이 있습니다.

  • ConcurrentHashMap은스레드로부터 안전한 즉동기화되었지만 HashMap은 동기화되지 않았습니다.
  • ConcurrentHashMap은 때때로 스레드가 기다려야하기 때문에 동기화되기 때문에 성능이 낮지 만 HashMap은 동기화되지 않고 모든 스레드가 동시에 액세스 할 수 있기 때문에 성능이 높습니다.
  • 두 스레드가 동시에 Object의 내용을 수정하거나 추가하려고하면 ConcurrentModificationException이 발생합니다. 그러나 ConcurrentHashMap의 경우 동일한 작업을 수행하는 동안 예외가 발생하지 않습니다.

  • HashMap의 키와 값에 대해 Null 값이 허용되지만 ConcurrentHashMap은 null 값을 추가하려고 시도한 키 및 값에 대해 null 값을 허용하지 않습니다. NullPointerException 예외가 발생합니다.

  • HashMap은 JDK 1.2에 도입 된 반면 ConcurrentHashMap은 JDK 1.5에 도입되었습니다.

더 나은 성능을 위해 앞서 살펴본 것처럼 이전에 테이블 세그먼트였던 테이블 버킷으로 노드 배열로 구성됩니다. 자바 8 .

버킷은 첫 번째 삽입이 수행 될 때 느리게 초기화됩니다. 모든 버킷은 버킷의 첫 번째 노드를 잠그면 독립적으로 잠글 수 있으며 읽기 작업도 차단되지 않습니다.

비교 HashMap, ConcurrentHashMap 추가 제공 concurrencyLevel 사용할 예상 스레드 수를 제어하는 ​​인수입니다.

생성자 :

  1. ConcurrentHashMap m = new ConcurrentHashMap ()

    기본 초기 용량 16,로드 계수 0.75 및 동시성 레벨 16으로 새 빈 맵이 생성됩니다.

  2. ConcurrentHashMap m = new ConcurrentHashMap (int initialCapacity)
    지정된 초기 용량, 0.75의로드 계수 및 동시성 레벨 16으로 새 빈 맵이 생성됩니다.

  3. ConcurrentHashMap m = new ConcurrentHashMap (int initialCapacity, float loadFactor)

    지정된 초기 용량과 동시성 수준이 16 인로드 계수로 새 빈 맵이 생성됩니다.

  4. ConcurrentHashMap m = new ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    지정된 초기 용량, 부하 계수 및 동시성 수준으로 새 빈 맵이 생성됩니다.

  5. ConcurrentHashMap m = new ConcurrentHashMap (맵 m)
    제공된 맵에서 새 ConcurrentHashMap을 생성합니다.

다른 두 인수 인 initialCapacity 및 loadFactor는 HashMap과 매우 동일하게 작동했습니다.
ConcurrentMap은 다중 스레드 환경에서 키 / 값 작업에서 일관된 메모리입니다.

Java의 동시 해시 맵에 대한이 기사로 이동

함정

객체를 검색하는 동안 ConcurrentHashMap은 차단되지 않고 업데이트 작업과 겹칠 수 있으므로 성능 향상을 위해 가장 최근에 완료된 업데이트 작업 만 검색합니다.

size, isEmpty 및 containsValue를 포함한 집계 상태 메소드의 결과는 일반적으로 맵이 다른 스레드에서 동시에 업데이트되지 않는 경우에만 유용합니다.

동시 업데이트가 제대로 제어되면 이러한 상태 방법을 신뢰할 수 있습니다.

이러한 방법이 실시간으로 보장되는 것은 아닙니다.

기본 테이블 용량은 16이지만 동시성 수준을 사용하여 변경할 수 있습니다.

public ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel) {// ... if (initialCapacity

키 키가 정렬 된 순서로 필요하면 ConcurrentSkipListMap을 사용할 수 있습니다.

이제 위의 프로그램을 실행 한 후 Java의 동시 해시 맵을 이해했을 것입니다. 따라서 우리는이 기사의 끝 부분에 이르렀습니다. 자세한 내용은 다음을 확인하십시오. , 신뢰할 수있는 온라인 학습 회사입니다. Edureka의 Java J2EE 및 SOA 교육 및 인증 과정은 Hibernate & Spring과 같은 다양한 Java 프레임 워크와 함께 핵심 및 고급 Java 개념 모두에 대해 교육하도록 설계되었습니다.

질문이 있으십니까? 이 기사의 댓글 섹션에 언급 해 주시면 가능한 한 빨리 연락 드리겠습니다.