[BE/JAVA] HashMap Synchronized 처리

2021. 4. 14. 00:53
728x90
반응형

2021.04.14

19일차

 

입사 38일차.

어느 대기업 면접에서 List, Map 등의 각 Collection에 대한 설명과 특징을 설명을 질문받았었다. 각 Collection에 대한 설명을 하면서 HashMap과 HashTable의 속도차이가 발생하는 원인(링크)에 대해 설명을 하던 도중,

 

면접관님은 내게 HashMap은 Synchronized처리를 어떻게 하는지 알고있냐는 질문을 하셨고, Synchronized에 처리유무에 따른 속도차이만 알고 있었던 나는 질문에 답하지 못하고 결국 최종면접에서 탈락했다. 물론 이 질문에 대해서만 답을 못한 것은 아니다.

 

그때 말하지 못했던 답을 지금 적어보려고 한다.

 

 

1. synchronizedMap(new HashMap<>())

  ① 출처 : 강아지의 코딩공부 (링크)

  ② Map Collection에 있는 synchronizedMap 객체를 사용하면 HashMap을 Thread-Safe 상태로 만들 수 있다.

  ③ Collections.synchronizedMap(new HashMap<>()) 과 같이 HashMap객체를 synchronizedMap의 파라미터로 넣어주면 된다.

package test;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class Test {
    Map map = Collections.synchronizedMap(new HashMap<>());
}

 

  ④ 위와 같은 코드로 작성하면 Thread Safe한 HashMap을 사용할 수 있게 된다.

  ⑤ 1.5 버전부터, HashTable의 속도문제, HashMap의 non-Thread Safe 문제를 보완한 ConcurrentHashMap<>이 제공되어 위의 문제들은 크게 고려할 필요가 없게 되었다. 하지만, 현업에서는 HashMap을 아직 많이 사용하기 있기 때문에, non-Thread Safe 이슈가 발생한다면 Collections.synchronizedMap()가 필요해질 것이다,

 

 

2. ConcurrentHashMap<>();

  ① 출처 : 조원호의 행복공간 (링크)

  ② HashTable의 속도문제와 HashMap의 non-Thread Safe문제를 보완한 객체

  ③ 검색(get())은 Lock이 이루어지지 않기 때문에, 다른 작업들과 동시에 진행할 수 있게 되어 HashTable의 속도문제를 보완해냈다.

package test;

import java.util.concurrent.ConcurrentHashMap;

public class Test {
    ConcurrentHashMap<K, V> map = new ConcurrentHashMap<>();
}

 

  ④ 위와 같은 코드로 작성하면 ConcurrentHashMap()을 사용할 수 있게 된다.

  ⑤ HashMap과 같은 메소드를 사용한다. ( put, get, clear, remove 등 )

 

 

아직까지는 ConcurrentHashMap을 사용하는 프로젝트를 열어보지 못해서 concurrentHashMap의 편리함을 느낄수는 없었다. 대부분 HashMap을 사용하고 있고, 애초에 non-Thread Safe 이슈가 발생할만한 구조를 피해서 코드를 작성했기 때문이다. 

 

HashTable에 대해 정보를 찾으면서 1.5버전 이후, HashTable처럼 사용빈도가 많이 줄게 된 객체들을 볼 수 있었다. 추후에 Duplicate 같은 객체들도 찾아보면 좋을 것 같다.

728x90
반응형

BELATED ARTICLES

more