티스토리 뷰

Programming Language/JAVA

HashTable, HashMap, ConcurrentHashMap

기내식은수박바 2019. 9. 1. 15:12
반응형

HashTable 특징

  • HashTable의 경우, 데이터 변경 메소드가 모두 Synchronized (동기화) 메소드로 선언되어 있다.
  • 메소드 호출 전에 멀티 쓰레드 환경에서 쓰레드 간에 Synchronized Lock (동기화 락) 을 걸기 때문에 데이터의 무결성을 보장한다.
  • Synchronized Lock은 시간이 오래걸리기 때문에 HashTable은 속도가 느리다.
  • 멀티 쓰레드 환경에서 사용하기 적합하다.

 

HashMap 특징

  • HashMap의 경우, HashTable와는 달리 동기화 (Synchronized) 처리를 하지 않기 때문에 데이터의 무결성을 보장하지 않지만 속도가 빠르다.
  • 단일 쓰레드 환경에서 사용하기 적합하다.

 

HashMap을 사용하여 동기화 문제 해결?

  • SynchronizedMap을 이용하여 해결할 수 있다.
  • Map Interface (HashMap, ....) 을 SynchronizedMap 클래스로 Wrapping하여 사용하면 해당 Map 객체는 동기화 맵 (Synchronized Map) 이 된다.
  • Map<T, F> map = Collections.synchronizedMap(new HashMap<T, F>()); 과 같이 사용한다.

 

ConcurrentHashMap

  • JAVA 1.5부터 사용가능한 ConcurrentUtil 인터페이스에서 제공하는 클래스이다.
  • ConcurrentHashMap은 SynchronizedMap 으로 Wrapping된 HashMap 이나 HashTable 보다 더 빠른 속도를 보이면서도 쓰레드 간의 동기화를 보장한다.
  • ConcurrentHashMap은 동기화 시, Map 전체에 동기화 락을 걸지 않고, Map을 여러 조각으로 쪼개 일부만 락을 거는 형태로 구현되어 있기 때문에 가능하다.
  • 이러한 이유로, 멀티 쓰레드 환경에서 쓰레드 간의 경쟁이 심한 경우, 더 효율적인 성능을 보인다.

 

스택 오버플로우 번역

- SynchronizedMap으로 감싼 HashMap과 ConcurrentHashMap의 차이점은 무엇인가?

  • Synchronized HashMap:
    1. 각 메소드는 객체 수준 락을 사용하여 동기화 된다. 그래서 SynchronizedMap의 get과 put 메소드는 락을 얻는다.
    2. 전체 컬랙션의 Locking (잠금) 은 성능 오버헤드를 발생시킨다. 하나의 쓰레드가 락을 유지하는 동안, 다른 모든 쓰레드는 컬랙션을 사용할 수 없다.
  • JDK 5에서 소개된 CuncurrentHashMap:
    1. 객체 수준에서 Locking (잠금) 은 없으며, Locking (잠금) 이 훨씬 더 Fine Granularity하다. ConcurrentHashMap의 경우, Lock이 HashMap의 Bucket 수준이 될 것이다.
    2. 더 낮은 수준의 Locking의 효과는 당신이 동기화 된 컬렉션에서 가능하지 않은 동시에 발생하는 reader와 writer를 가질 수 있다는 것이다. 이러한 점은 더 큰 확장가능성을 끌어낸다.
    3. ConcurrentHashMap은 하나의 쓰레드가 다른 쓰레드가 일을 반복하는 동안 그것을 수정하려고 하면ConcurrentModificationException 예외를 던지지 않는다.

- Lock Granularity?

  • Lock의 단위로, 정확히 말하면 Lock을 구현하기 위해 드는 시간 및 공간 소모에 대한 단위를 말한다.
  • 공간 - 어떤 단위로 Lock을 걸 것인가? (ex. DB의 Record, Block, File, Database / Program의 Block, Method, Object)
  • 시간 - Lock을 사용하기 위해 소모되는 Request, Release 시간 등 Lock과 관련된 모든 Overhead를 말한다.
  • 보통 공간 단위를 가지고 크게 두 가지로 Lock 단위를 구분한다.
    1. 크기가 작은 단위가 대상이라면 Fine Granularity (ex. File, ...)
    2. 큰 단위가 대상이라면 Coarse Granularity (ex. Record, ...)

 

HashMap의 메소드

Method Description
void clear() HashMap에 저장된 모든 Object를 제거한다. (ex. map.clear())
Object clone()

현재 HashMap을 복제하여 Return 한다.

(ex. newmap = (HashMap)map.clone())

boolean containsKey(Object Key) HashMap에 지정된 키가 포함되어 있는지 알려준다.
boolean containsValue(Object Value) HashMap에 지정된 값이 포함되어 있는지 알려준다.
Set entrySet()

HashMap에 지정된 Key-Value 값을 Entry 형태 (Key, Value) 의 형태로 Set에 저장하여 Return 한다.

(ex. Set set = map.entrySet()

Result : [1=son, 2=kim, 3=choi, 4=lee, 5=bark])

Object put(Object Key, Object Value)

HashMap에 Key와 Value를 저장한다.

(ex. map.put(1, "son"), map.put(2, "kim"), ... )

Object get(Object Key)

지정된 Key의 Value를 Return 한다.

(ex. map.get(2)

Result : kim)

boolean isEmpty() HashMap이 비어있는지 확인한다.
Object remove(Object Key) 지정된 Key의 Value를 제거한다. 
int size() HashMap에 저장된 Element의 개수를 Return 한다.

 

ConcurrentHashMap의 메소드

Method Description
void computeIfAbsent(Object Key, (Variable) -> Value)

해당 Key가 존재하지 않다면 생성하고 Value 값을 삽입한다.

(ex. 

ConcurrentHashMap<String, Integer> map

            = new ConcurrentHashMap<>();

map.computeIfAbsent("PC", k -> 60000);

map.computeIfAbsent("Charger", k -> 800);)

이외에는 HashMap과 동일하게 작동한다.

 

Reference

 

반응형

'Programming Language > JAVA' 카테고리의 다른 글

equals() & hashcode()  (0) 2019.11.29
문자열 (String) 형변환 : Casting, valueOf, toString  (1) 2019.09.08
StringTokenizer  (0) 2019.09.06
String, StringBuilder, StringBuffer  (0) 2019.09.02
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함