HashTable, HashMap, conCurrentHashMap 차이
우선 아래 글을 쭈욱 읽으면 끝난다....나보다 정말 잘 정리해논 글들이기 때문에....
*퍼온 글
Hashtable 의 모든 Data 변경 매소드는 syncronized 로 선언되어있습니다.
즉 매소드 호출 전 쓰레드간 동기화 락을 통해 멀티 쓰레드 환경에서 data의 무결성을 보장해줍니다.
반대로 HashMap 은 그런 선언이 없기 때문에 멀티 쓰레드에서 여러 쓰레드가 동시에 객체의
data 를 조작하는 경우 data가 깨져버리고 심각한 오류가 발생할 수 있습니다.
다만 이 동기화 락이 매우 느린 동작이기때문에 Hashtable 보다 HashMap 이 훨씬 빠릅니다.
Map 객체가 단일 쓰레드에서만 쓰일때는 HashMap을 사용해야합니다.
프로그래밍상의 편의성 때문에 멀티쓰레드 환경에서도 Hashtable 을 쓰기 보다는
HashMap을 다시 감싸서
Map m = Collections.synchronizedMap(new HashMap(...));
과 같은 형태가 최근에는 더 선호됩니다.
자세한 사용 설명은 javadoc 문서를 참고하세요.
**퍼온 글
HashMap과 HashTable은 동일한 내부 구조를 가지고 있지만
HashTable의 경우는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가
동시에 이 메소드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드가 실행가능하다.
이는 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다는 것을 의미한다.
일반적으로 동기화가 필요 없다면 HashMap을, 동기화 보장이 필요하다면 Hashtable을 사용하면된다.
HashMap과 Hashtable은 동기화를 보장하느냐 하지 않느냐는 측면 이외에는 차이가 거의 없다.
사용법도 똑같아, put() 메서드로 데이터를 삽입하고, get() 메서드로 추출하면된다.
Vector는 데이터(Data)에 해당하는 객체만을 이용했지만, Hashtable은 Map 인터페이스를 구현한 클래스이기 때문에 검색을 위한 키와 값을 함께 넣어주어야 한다.
출처: http://firedev.tistory.com/entry/Java-HashMap과-Hashtable-의-차이점 [개발노트]
***퍼온 글
HashMap을 Thread-safe 하기 위해 만든 클래스가 ConCurrentHashMap입니다. 하지만 HahMap과 다르게 key,value에 null 값을 허용하지 않습니다. 또한 putIfAbsent라는 메서드를 가지고 있습니다.
**** 요약
HashTable
HashTable의 메서드는 전부 synchronized 키워드가 붙어있기 때문에 메서드 호출 전 쓰레드간 동기화 락을 통해 멀티 쓰레드 환경에서 data의 무결성을 보장해준다. 또한 key,value값의 null을 허용하지 않는다. 즉 동기화 락때문에 속도는 느리지만, data의 안정성이 높고 신뢰가 높은 컬렉션이다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java] multi thread 구현 01 (1) | 2017.06.29 |
---|---|
[Java] JVM 메모리 구조 (4) | 2017.06.28 |
[Java] enum 이란? (3) | 2017.06.27 |
[Java] 멀티스레드 개념 (2) | 2017.06.27 |
[Java] 객체지향프로그래밍 (OOP)란? (0) | 2017.06.12 |
댓글