강의로 돌아가기
김준혁

해당 강의 영상에서 Synchronized 블록 출력에 문제가 있습니다.

해당 영상에서 카페음악에 Synchronized 블록을 처리하였음에도 신나는 음악이 끝나자 카페음악이 1번 출력되었던데요 이는 왜 그런건가요?

3 개의 답변
-

답변은 아니고 저도 직접 해보니 중간에 1번 출력되는데 이게 어떤 원리인지 궁금해요

김우성

'신나는 음악' 동기화 이후 다음 실행을 선택하는 과정에서 '카페 음악' 이 한번 선택된거 같아요. 근데 카페음악은 동기화가 메서드 전체에 걸려 있지 않으므로 한번 걸렸을 때 바로 그다음으로 넘어가게 됩니다. 그 과정에서 한번 출력된거 같습니다.

저는 프로그래머스 개발자는 아니고 같이 공부하는 유저입니다. 틀렸으면 바로 수정 부탁드려요

-

synchronized 가 for문 전체가 아닌 출력 부분에만 블럭을 씌웠으므로
한번 실행되고 다른 부분에서 모니터링 락을 잡았다면 그 해당 메소드 전체가 실행되고 나서
System.out.println 부분이 실행 되는 것 같습니다.
만약 for문 전체를 synchronized 블럭을 for 문부터 println 밑까지 블럭을 씌운다면
playMusicC 의 목적인 10번 실행이 모두
synchronized 안에서 끝나게 되어버리므로
Thread.sleep 메소드는 실행조차 되지 않습니다.

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.