Skip to content

[사전 과제] 동시성 이슈 해결#12

Closed
kwantke wants to merge 4 commits intohanghae-skillup:mainfrom
kwantke:week0
Closed

[사전 과제] 동시성 이슈 해결#12
kwantke wants to merge 4 commits intohanghae-skillup:mainfrom
kwantke:week0

Conversation

@kwantke
Copy link

@kwantke kwantke commented Jan 5, 2025

제목(title)

[사전 과제] 동시성 이슈 해결

작업 내용

  • 멀티스레드 환경에서 동시성 문제를 해결하기 위해 HashMap 대신에 ConcurrentHashMap 사용
private final Map<String, Integer> productDatabase = new ConcurrentHashMap<>();
private final Map<String, OrderInfo> latestOrderDatabase = new ConcurrentHashMap<>();
...
// ConcurrentHashMap의 compute 함수를 사용하여 변경할 값으로 업데이트를 수행
productDatabase.compute(productName, (key, currentStock) -> { ... }
  • ThreadLocal을 사용하여 스레드별 독립된 저장소에 주문 데이터를 관리하도록 함
// ThreadLocal에서 여러개의 주문 객체들을 관리하기 위하여 Map 사용
private final ThreadLocal<Map<String, OrderInfo>> threadLocalOrder = ThreadLocal.withInitial(HashMap::new);
...
// 독립된 저장소에 주문정보 추가
threadLocalOrder.set(new OrderInfo(productName, amount, System.currentTimeMillis()));
latestOrderDatabase.put(productName, threadLocalOrder.get());

// 다 사용한 스레드의 독립저장소 데이터 삭제
threadLocalOrder.remove();

발생했던 문제와 해결 과정을 남겨 주세요.

  • 멀티 스레드 환경에서 재고 데이터가 업데이트되기 전에 여러 스레드에서 사용됨으로 인해서 재고 수량 관리가 제대로 관리가 안되는 동시성 이슈가 있었습니다. 이를 ConcurrentHashMap을 사용하여 동기화 이슈를 해결하였습니다.

이번 주차에서 고민되었던 지점이나, 어려웠던 점을 알려 주세요.

과제를 해결하며 특히 어려웠던 점이나 고민되었던 지점이 있다면 남겨주세요.

리뷰 포인트

리뷰어가 특히 의견을 주었으면 하는 부분이 있다면 작성해 주세요.

ex) Redis 락 설정 부분의 타임아웃 값이 적절한지 의견을 여쭙고 싶습니다.

기타 질문

추가로 질문하고 싶은 내용이 있다면 남겨주세요.

ex) 테스트 환경에서 동시성 테스트를 수행하였고, 모든 케이스를 통과했습니다. 추가할 테스트 시나리오가 있을까요?

- ConcurrentHashMap 과 ThreadLocal 을 사용하여 동시성 이슈 해결
- ThreadPool 사용시를 대비하여 ThreadLocal remove 함수 추가
- 주문 수를 일반 텍스트가 아닌 변수에 저장 후 호출 방식으로 수정
- 빈줄 제거
- 지문에 `UserA 가 사과를 2개, 3개 총 2번 구매한 경우 latestOrderDatabase 에서 사과로 꺼낼 시 총 3개가 되어야 합니다.` 내용과 `latestOrderDatabase에 과일명을 key 값으로 한 것`으로 봤을때 과일별 최신 주문데이터를 저장으로 수정.
- 현재 스레드별 ThreadLocal<Map>으로 과일별 객체 관리가 불필요하여 원복함
@kwantke kwantke closed this Nov 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant