Skip to content

Counter 예제 구현 #31

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 77 commits into from
Apr 11, 2024
Merged

Counter 예제 구현 #31

merged 77 commits into from
Apr 11, 2024

Conversation

ooMia
Copy link
Contributor

@ooMia ooMia commented Mar 29, 2024

개요

  • 다양한 카운터 구현체

변경 사항

  • ✨ Feat : AtomicInteger 카운터
  • ✨ Feat : CompletableFuture 카운터
  • ✨ Feat : Synchronized 카운터
  • ✨ Feat : BasicCounter
  • ✨ Feat : LockCounter
  • ✨ Feat : PollingCounter
  • ✨ Feat : BatchingCounter

추가 정보

관련 이슈

Close #17 -> Close #27

haxr369 and others added 12 commits March 26, 2024 18:03
✅ Test : 테스트 코드 추가

1. 비동기 서비스 클래스 생성
2. 생성한 메서드에 대한 기본 테스트 작성

1. 여러 입출력 상황에 맞게 비동기 메서드 호출과 비동기 객체 병합 방법 강구
1. 메서드가 비동기 메서드인지 확인하는 테스트 작성
2. @async를 붙인 메서드가 비동기로 동자가하지 않고 하나의 쓰레드에서 동작한다.
✅ Test : 테스트 코드 추가

1. 다중 스레드 설정을 위해 taskExecutor 메서드 빈으로 저장
2. 비동기 메서드 다중 호출 시 병렬적으로 동작하는지 testGetMultiString에서 검증
3. 비동기 메서드의 지연시간이 길어질 경우 타임아웃 발생하도록 하는 부분 검증
✅ Test : 테스트 코드 추가

1. 비동기 호출을 10회 하는 비동기 메서드를 10회 호출하는 calculateRunTime 작성
2. 비동기 호출이 100회 일 때 50개는 쓰레드가 실행하고 나머지 50개는 블록킹 큐에서 대기한다.
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
@ooMia ooMia added the enhancement New feature or request label Mar 29, 2024
@ooMia ooMia added this to the 스레드 동시성 제어 milestone Mar 29, 2024
@ooMia ooMia linked an issue Mar 29, 2024 that may be closed by this pull request
@ooMia ooMia changed the title ✨ Feat : Counter Counter 예제 구현 Mar 29, 2024
Copy link

codecov bot commented Mar 29, 2024

Codecov Report

Attention: Patch coverage is 90.76087% with 17 lines in your changes are missing coverage. Please review.

❗ No coverage uploaded for pull request base (main@7bf0d66). Click here to learn what that means.

Files Patch % Lines
.../thread/concurrency/executor/CounterBenchmark.java 89.28% 2 Missing and 4 partials ⚠️
...oncurrency/SpringThreadConcurrencyApplication.java 0.00% 4 Missing ⚠️
.../concurrency/counter/CompletableFutureCounter.java 86.66% 2 Missing ⚠️
...com/thread/concurrency/counter/PollingCounter.java 88.88% 0 Missing and 2 partials ⚠️
.../concurrency/counter/batch/AtomicBatchCounter.java 94.11% 0 Missing and 1 partial ⚠️
.../batch/ConcurrentParameterizedBatchingCounter.java 95.00% 0 Missing and 1 partial ⚠️
...ead/concurrency/counter/queue/CounterConsumer.java 91.66% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main      #31   +/-   ##
=======================================
  Coverage        ?   90.32%           
  Complexity      ?       65           
=======================================
  Files           ?       13           
  Lines           ?      186           
  Branches        ?       11           
=======================================
  Hits            ?      168           
  Misses          ?        9           
  Partials        ?        9           
Flag Coverage Δ
integration 90.32% <90.76%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

ooMia and others added 12 commits March 30, 2024 06:13
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
✅ Test : 테스트 코드 추가

1. BasicCounter 구현. 멀티 쓰레드로 카운터 동시 업데이트 불가 테스트
2. SynchronizedCounter 구현. 멀티 쓰레드로 카운터 동시 업데이트 가능 테스트. Synchronized만 사용했을 때는 0.5s 소요
3. Completable 사용하면 실행시간이 대폭 감소
1. SynchronizedCounter 테스트의 실질적 실행시간을 로깅하도록 리팩토링
✅ Test : 테스트 코드 추가

1. CompletableFuture를 이용한 카운터 작성
2. 카운터에 int가 아닌 CompletableFuture<Integer>를 저장
3. 작업의 완성본을 저장하지 않고 작업 진행 중인 Future 객체를 저장하는 점에서 추후 캐싱 시나리오에 도움될 것으로 보임
# Conflicts:
#	src/main/java/com/thread/concurrency/counter/BasicCounter.java
#	src/main/java/com/thread/concurrency/counter/Counter.java
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
1. 컨슈머는 브로커에게서 이벤트를 가져와 처리한다.
2. 프로듀서는 브로커에게 이벤트를 저장한다.
3. 브로커는 큐를 관리하고 큐에 이벤트 삽입과 제거를 담당한다.
1. 프로듀서-컨슈머 패턴을 이용한 카운터 구현을 위해 테스트를 작성
2. 시간 측정 결과 기존 CompletableFutureCounter에 2배 시간이 걸리는 걸로 나왔다.

To Do
CompletableFutureCounterTest와 QueueCounterTest에 쓰이는 쓰레드 수를 같게해서 다시 시간을 측정해보기
1. 브로커를 테스트에서 제거
2. 단일한 큐를 컨슈머와 프로듀서가 공유
3. 컨슈머가 카운터를 업데이트하는 역할을 가짐

To Do
컨슈머의 consumEvent를 실행하는 스레드와 show를 호출하는 메인 스레드 간 싱크가 맞지 않는다.
모든 consumEvent가 끝나고 show를 호출할 수 있는 방법이 필요하다.
haxr369 and others added 25 commits April 7, 2024 17:32
1. 프로듀서 컨슈머 패턴 테스트 정리
# Conflicts:
#	src/main/java/com/thread/concurrency/counter/CompletableFutureCounter.java
#	src/main/java/com/thread/concurrency/counter/SynchronizedCounter.java
#	src/test/java/com/thread/concurrency/CounterTest.java
#	src/test/java/com/thread/concurrency/queueCounter/QueueCounterTest.java
# Conflicts:
#	README.md
#	src/test/java/com/thread/concurrency/counter/AtomicCounterTest.java
#	src/test/java/com/thread/concurrency/counter/CompletableFutureCounterTest.java
#	src/test/java/com/thread/concurrency/counter/CounterTest.java
#	src/test/java/com/thread/concurrency/counter/SynchronizedCounterTest.java
✅ Test : 테스트 코드 추가

1. 프로듀서 컨슈머의 인터페이스 작성
2. 인터페이스를 이용해 테스트 리팩토링
## 개요

- 블로킹 큐를 이용한 프로듀서-컨슈머 패턴 구현 완료
- 구현에 따라 Integer.MAX_VALUE를 카운팅하는 요구사항 만족

## 변경 사항

[x] 🤖 Refactor : 코드 리팩토링
[x] ✅ Test : 테스트 코드 추가
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
- 메서드 순서 변경 (public, 깊이 우선)

Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Signed-off-by: Hyeon-hak Kim <hyeonhak.kim.dev@gmail.com>
Copy link
Contributor Author

@ooMia ooMia left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

답변 완료

@ooMia ooMia enabled auto-merge April 10, 2024 14:41
@ooMia ooMia merged commit e462d92 into main Apr 11, 2024
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
No open projects
Development

Successfully merging this pull request may close these issues.

멀티 쓰레드 자원 업데이트 문제
2 participants