본문 바로가기

스프링

동시 요청 문제 - ConcurrentHashMap

참고 출처: https://www.youtube.com/watch?v=Ejw0GQLI9z8

 

Concurrent 클래스

- Concurrent 예시 : ConcurrentHashMap, ConcurrentMap, ConcurrentLinkedQueue 등

- 멀티 쓰레드 환경에서, 쓰레드로 부터 안전하게 관리. (쓰레드 안전한 객체 보장) ➡️ 멀티 쓰레드 환경에선 Concurrent를 자주 사용하는 경우가 많음.

- 보통 Concurrent 뒤에 붙은 자료구조 Interface의 구현체. (ConcurrentHashMap ➡️ Map 인터페이스의 구현체 / ConcurrentLinkedQueue ➡️ Queue 인터페이스의 구현체)

- 성능이 좋다.

- Update 작업에 해당되는 Segment만 잠기고, 다른 세그먼트들은 항상 열려 있음

- 여러 세그먼트에서 여러 작업이 가능.

 

ConcurrentHashMap 작동방식

- 4개의 세그먼트를 가짐.

- 각 세그먼트에는 Key-Value 값을 가진 노드들이 LinkedList로 연결되어 있음.

- 첫번째 세그먼트(Segment 0)는 Null

 

Case 1. "102"의 Key를 가진 Node를 수정할 경우)

1. Key 값이 "102"인 Node를 찾음.

2. 해당 Node의 Segment를 잠금. (잠금 상태에서도 읽기는 가능)

3. 해당 Node를 수정.

4. 해당 Segment의 잠금을 해제

 

Case 2. Key 값이 "102"인 Node와 "103"인 Node를 동시 수정)

1. Key 값이 "102"인 Node와 "103"인 Node를 찾음

2-1. 두 노드가 같은 Segment인 경우, 해당 세그먼트를 잠그고, 앞쪽에 있는 Node를 수정 후, 다음 Node를 수정

2-2. 두 노드가 다른 Segment인 경우, 두 세그먼트를 잠그고, Node들을 수정

3. Lock된 세그먼트들을 해제

 

(아직 잘 이해가 안되므로, 다른 자료들을 참고 후 업데이트할 예정)