밑에 한줄요약 있음 ㅇㅅㅇ




synchronized 함수는 mutex 락이 풀릴때까지 suspend 시키지 않음

아마 Thread 를 그냥 락 시켜버리는거 같음

왜냐면 저걸 실행시키면 First 가 끝난 뒤, Second 가 실행되는데

그동안 Single2 쓰레드는 놀고있음에도 불구하고 세번째 코루틴은 실행되지 않음

Second Coroutine 은 suspend 되지 않아서 쓰레드를 점유하고 있기 때문이야




그럼 이걸 어떻게 개선을 해야하나면 synchronized 함수 말고 mutex.withLock 함수를 쓰면 최적화가 가능함




withLock 함수는 suspend 함수임. 즉 스위칭이 일어날 수 있단 뜻


실행해보면




Second Coroutine 은 더이상 뮤텍스에 의해 락이 되어있는 동안 쓰레드를 점유하지 않음


콘솔에 찍힌것처럼 First 가 돌고 있어서 뮤텍스 락 됐을 때 suspend 되기 때문에 쓰레드를 비워주게 되고


Third Coroutine Finish 가 콘솔에 찍힐 수 있게 됐음



First 가 끝나고 뮤텍스 락이 풀렸을 때 Second Coroutine 은 resume 되며 실행됨







한줄 요약: 코루틴 쓸 때 동기화 하고 싶으면 synchronized 말고 withLock, lock을 사용하자