Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Java] 32. HashTable vs HashMap vs ConcurrentHashMap #59

Open
CMSSKKK opened this issue Oct 31, 2022 · 1 comment
Open

[Java] 32. HashTable vs HashMap vs ConcurrentHashMap #59

CMSSKKK opened this issue Oct 31, 2022 · 1 comment
Labels
JAVA 자바 질문

Comments

@CMSSKKK
Copy link
Member

CMSSKKK commented Oct 31, 2022

HashTable vs HashMap vs ConcurrentHashMap

키워드

Thread-Safe, Synchronized, Hash 충돌

@CMSSKKK CMSSKKK added the JAVA 자바 질문 label Oct 31, 2022
@CMSSKKK
Copy link
Member Author

CMSSKKK commented Oct 31, 2022

공통점

  • 자바에서 사용할 수 있는 key, value로 데이터를 저장하는 자료구조입니다.

차이점

  • Thread-safe의 여부 및 동기화 방식에 대한 차이가 가장 큽니다.

  • HashTable

    • Thread-Safe 해서 멀티 스레드 환경에서 사용할 수 있습니다.
    • 하지만 data를 read, write하는 메서드들이 Synchronized 키워드가 붙어 있는 동기화 메서드로 성능적으로 좋지 않습니다.
    • 동시성을 고려하지 않아도 되는 상황 모두에서도 Lock을 걸기 때문입니다.
  • HashMap

    • 가장 자주 접하게 되는 Key, value 자료구조이지만 Thread-Safe 하지 않기 때문에 멀티스레드 환경에서의 사용은 자제해야합니다.
  • ConcurrentHashMap

    • 이름에서 부터 확인할 수 있듯이 Thread-safe한 자료구조입니다.
    • ConcurrentHashMap의 데이터를 삽입하는 put() 메서드의 경우, 기본적으로 데이터를 삽입하고자 할때 원자성을 보장하는 CAS(CompareAndSwap) 메서드를 사용합니다.
    • 하지만 이 경우는 해당 key (or hash값)이 일치하는 Node가 없을 때의 경우로, 삽입하고자하는 해쉬 버킷에 Node가 이미 존재한다면, 해당 버킷을 Lock을 겁니다. (synchronized 블록을 활용)
    • 그렇기 때문에 같은 해쉬 버킷에 접근하는 경우가 아니라면 여러 스레드가 데이터를 읽고, 쓰는 과정에서의 동기화가 보장됩니다.
    • (이전에도 HashTable보다 동기화 방식에서 효율적이었으나 Java 8에서 위 방식으로 구현이 변경이 되어 성능이 더 좋아졌음)

++ Hash 충돌을 해결하는 방법의 경우 대표적으로 Open Addressing, Separate Chaining 방식 있습니다.
++ Java는 Separate Chaining 방식으로 충돌을 해결합니다.
++ 데이터의 수가 작다면 Open Addressing, 데이터 수가 많다면 Separate Chaining 이 성능적으로 유리합니다.

Reference

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JAVA 자바 질문
Projects
None yet
Development

No branches or pull requests

1 participant