일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- kotiln const val
- 전략 패턴이란
- Spring ipfs
- java 파티
- 백준 특정한 최단 경로
- go
- spring mongodb switch
- Java Call By Refernce
- kotiln functional interface
- java 1509
- java 백준 1509
- ipfs bean
- 백준 2252 줄세우기
- spring mongoTemplate
- 자바 백준 팩토리얼 개수
- 익명 객체 @transactional
- kotiln const
- spring mongoTemplate switch
- java 팩토리얼 개수
- mongodb lookup
- 백준 1504 java
- spring mongodb
- 자바 1676
- 안정해시
- ipfs singletone
- rabbitmq 싱글톤
- java 1238
- nodejs rabbitmq
- 백준 연결요소 자바
- javav 1676
Archives
- Today
- Total
공부 흔적남기기
kotlin/java latch await not work 문제 troubleshooting 본문
728x90
반응형
동시성 문제에 대한 테스트를 위해
100개의 스레드에서 서비스에 접근하는 테스트를 하는 도중
latch.await을 했음에도 불구하고 계속해서 thread들이 끝나지도 않았는데, 테스트가 끝나는 문제가 있었다.
코드를 자세히 살펴보면 문제가 보이나,
맞다고 생각하고 대충보면 문제가 보이지 않는다... 이것 때문에 대략 1시간은 뻘짓을 한 것 같다..
@Test
fun decrease_concurrent() {
val threadCount = 100;
val executorService = Executors.newFixedThreadPool(threadCount)
val latch = CountDownLatch(threadCount);
for (i in 1..threadCount){
kotlin.runCatching {
executorService.submit {
stockService.decrease(stockId, 1)
}
}.also{
latch.countDown()
}
}
latch.await()
val stock = stockRepository.findById(stockId).get()
Assertions.assertThat(stock.quantity).isEqualTo(0L)
}
}
문제를 살펴보면 runCatching의 범위가 잘못 설정된 것이다.
executorService.submit은 thread를 시작시키는 것인데,
thread를 시작만 해놓고 latch.countDown()을 하니 모든 thread가 끝나기도전에 테스트가 끝나버리는 것이다.
따라서 해당 runCatching을 다음과 같이 바꿔주었다.
@Test
fun decrease_concurrent() {
val threadCount = 100;
val executorService = Executors.newFixedThreadPool(threadCount)
val latch = CountDownLatch(threadCount);
for (i in 1..threadCount) {
executorService.submit {
kotlin.runCatching {
stockService.decrease(stockId, 1)
}.also {
latch.countDown()
}
}
}
latch.await()
val stock = stockRepository.findById(stockId).get()
Assertions.assertThat(stock.quantity).isEqualTo(0L)
}
문제 해결 완료..
728x90
반응형
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
kotiln 객체 복사 방식 (얕은복사/copy()/깊은복사) (0) | 2024.11.24 |
---|---|
kotlin interface 익명 내부함수 lambda로 대체 (0) | 2023.12.04 |
kotlin inline function 사용 이유 (0) | 2022.12.06 |