태초에(Java 1.0 ~ 1.1) Java 언어에서 제공하는 key, value쌍을 지원하는 데이터 Container는 Hashtable 클래스가 제공되었었습니다.

그런데 이 Hashtable은 느리기도 하고 지원하는 메소드도 기능이 많이 부족해
Java 1.2부터는 HashMap을 포함해 여러 key, value쌍을 지원하는 클래스가 새로 생겼는데요.

이와 동시에 이런 key, value쌍을 쓰는 클래스들의 공통된 인터페이스를 Map인터페이스로 묶었습니다. (활용성을 높이기 위해)

Hashtable도 Java 1.2부터 Map을 implements하기 시작합니다.

그래서 key, value쌍을 지원하는 대부분의 클래스들은 Map을 구현하게 되어있는데

대표적인 Hashtable, HashMap 은 key와 value 를 hash알고리즘에 의해 구현해 놓은 것입니다.

TreeMap같은 경우는 이름에서부터 알수 있듯이 tree 알고리즘에 의해 key, value를 저장하고 있습니다.

구현체마다 독특한 특성이 있는데 HashMap의 경우 hash알고리즘에 의해 get이 매우 빠르며

TreeMap의 경우 tree소팅을 한 상태로 저장함으로서 data소팅시 유리합니다.

그럼 같은 알고리즘을 쓰는 Hashtable과 HashMap은 무슨 차이가 있냐면,

Hashtable의 모든 Data변경 매소드는 syncronized로 선언되어있습니다.

즉 매소드 호출 전 쓰레드간 동기화 락을 통해 멀티 쓰레드 환경에서 data의 무결성을 보장해줍니다.

반대로 HashMap은 그러한 선언이 없기 때문에 멀티 쓰레드에서 여러 쓰레드가 동시에 객체의

data를 조작하는 경우 data가 깨져버리고 심각한 오류가 발생할 수 있습니다.

다만, 이 동기화 락이 매우 느린 동작이기때문에 Hashtable보다 HashMap이 훨씬 빠릅니다.

Map객체가 단일 쓰레드에서만 쓰일때는 HashMap을 사용해야합니다.

프로그래밍상의 편의성 때문에 멀티쓰레드 환경에서도 Hashtable을 쓰기 보다는 HashMap을 다시 감싸서

Map m = Collections.synchronizedMap(new HashMap(...));

과 같은 형태가 최근에는 더 선호됩니다.

자세한 사용 설명은 javadoc 문서를 참고하세요.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/HashMap.html

Java 1.5 환경부터는 cuncurrent util이 default 로 제공되게 되어 멀티 쓰레드 환경에서 위 방법 보다는 CuncurrentHashMap 클래스를 사용하는게 더 선호됩니다.

CuncurrentHashMap은 synchronizedMap으로 감싸진 HashMap이나 Hashtable보다 더 빠르면서도 쓰레드간 동기화를 보장해 주는데,
이는 동기화시 hashtable을 전체에 대해 lock을 걸지 않고 조각을 쪼개어 부분부분 lock 걸어
쓰레드간 경쟁이 심할시에 이득을 보는 구현입니다.

'Language > Java' 카테고리의 다른 글

자바 메소드(Method) 타입 : public, protected..  (0) 2022.01.19
Java 소켓 통신 이란?  (0) 2022.01.07
String, StringBuffer, String Builder 차이점, 설명  (0) 2022.01.03
AtomicLong 이란?  (0) 2022.01.01
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기