일단 씻고 나가자

24.06.17 본문

Study/닥치는 대로 주워 담기

24.06.17

일단 씻고 나가자 2024. 6. 17. 21:55

2024. 06. 17 월요일

 

- [Effective Java] HashMap의 내부 구조 원리, 동시성을 해결하기 위한 구현체?

: HashMap은 정수인 key를 활용하여 해싱 후 해당 위치에 값을 저장하는 구조로 되어 있다.

이때 값의 자료구조(배열)를 버킷이라 하며, HashMap은 내부적으로 Node<Key, Value> 객체로 가지고 있다. 용량의 75% 이상이 되면 해시 충돌의 가능성이 커지는데, 따라서 용량의 75%가 넘어가는 경우 내부적으로 HashMap의 총용량을 늘린다. 이럼에도 충돌은 피할 수 없는데, 충돌 초기에는 Node 객체의 next 주소를 활용하다가 일정 횟수가 넘어가면 Red-Black tree의 형태로 구조를 바꾼다.

(추가로 Map.putIfAbsent() 보다 if(Map.get() == null) Map.put()의 성능이 더 좋다고 한다)

 

Java의 경우 Map의 동시성 문제를 Collections.synchronizedMap(new HashMap<>()) 혹은

new ConcurentHashMap()으로 해결하는데, synchronized의 경우 객체 레벨에서 객체 전체를 lock을 걸고, concurrent의 경우 write에서만 개별 버킷 수준의 lock을 걸기 때문에 성능이 더 뛰어나다.

'Study > 닥치는 대로 주워 담기' 카테고리의 다른 글

24.06.19  (0) 2024.06.19
24.06.18  (0) 2024.06.18
24.06.13  (1) 2024.06.13
24.06.12  (0) 2024.06.12
24.06.10  (0) 2024.06.10