티스토리 뷰
반응형
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:
- 각 메소드는 객체 수준 락을 사용하여 동기화 된다. 그래서 SynchronizedMap의 get과 put 메소드는 락을 얻는다.
- 전체 컬랙션의 Locking (잠금) 은 성능 오버헤드를 발생시킨다. 하나의 쓰레드가 락을 유지하는 동안, 다른 모든 쓰레드는 컬랙션을 사용할 수 없다.
- JDK 5에서 소개된 CuncurrentHashMap:
- 객체 수준에서 Locking (잠금) 은 없으며, Locking (잠금) 이 훨씬 더 Fine Granularity하다. ConcurrentHashMap의 경우, Lock이 HashMap의 Bucket 수준이 될 것이다.
- 더 낮은 수준의 Locking의 효과는 당신이 동기화 된 컬렉션에서 가능하지 않은 동시에 발생하는 reader와 writer를 가질 수 있다는 것이다. 이러한 점은 더 큰 확장가능성을 끌어낸다.
- ConcurrentHashMap은 하나의 쓰레드가 다른 쓰레드가 일을 반복하는 동안 그것을 수정하려고 하면ConcurrentModificationException 예외를 던지지 않는다.
- Lock Granularity?
- Lock의 단위로, 정확히 말하면 Lock을 구현하기 위해 드는 시간 및 공간 소모에 대한 단위를 말한다.
- 공간 - 어떤 단위로 Lock을 걸 것인가? (ex. DB의 Record, Block, File, Database / Program의 Block, Method, Object)
- 시간 - Lock을 사용하기 위해 소모되는 Request, Release 시간 등 Lock과 관련된 모든 Overhead를 말한다.
- 보통 공간 단위를 가지고 크게 두 가지로 Lock 단위를 구분한다.
- 크기가 작은 단위가 대상이라면 Fine Granularity (ex. File, ...)
- 큰 단위가 대상이라면 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
- https://ooz.co.kr/71
- https://stackoverflow.com/questions/1291836/concurrenthashmap-vs-synchronized-hashmap
- http://ecomputernotes.com/database-system/rdbms/lock-granularity
반응형
'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 |
댓글