묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
스레드 실행 위치 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]섹션 5의 <프린터 예제3 - 인터럽트 코드 개선 관련> 질문입니다.printer.addJob(input) 관련하여, 어떤 스레드에서 어디서부터 어디까지 책임지고 실행하는지 헷갈려서 정리해봤는데 검토해주시면 감사하겠습니다. === printer.addJob(input) 은 main 스레드(호출 스택)에서 실행된다.공유하는 Heap 메모리 영역에 Printer 객체 주소가 있다.main 스레드는 Printer 객체의 jobQueue 변수에도 접근이 가능하고 addJob() 메서드를 호출할 수 있다.따라서, addJob() 메서드에 대한 스택 프레임도 main 스레드(호출 스택)에 쌓여서 처리된다. === JPA 이후 오랜 만에 영한님 강의를 다시 듣기 시작했는데 재밌네요. 늘 감사합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
2:33초의 강의 내용
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]2:33초의 강의 내용 중 비효율이 있을 뿐 로직은 모두 정상 작동한다. 이 부분 말씀이 그냥 소비자가 소비자를 깨우는 상황에도 예를 들어 put(), take() 안의 로직이 작동한다는 거죠? 만약 생성자나 소비자가 같이 대기 하고 있을 때 같은 종류의 스레드만 계속해서 깨울 시에 starvation이 발생할 수 있는 것과는 이야기와는 별개인거 맞을까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
executor service를 스프링에서 이용한다면 어떻게 관리하는게 좋은가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]실무에서 강의를 수강하기 이전에 자바에서 제공하는 executor service를 사용하여 병렬로 프로그램을 짠 경험이 있는데요.저는 spring boot를 사용하여 service 내부에 executors의 고정스레드풀을 사용하여 특정 서비스를 호출할때마다 생성하도록 했습니다.예를 들면, List<?> methodA(req) { ExecutorService es = Executors.newFixedThreadPool(10); List<CompletableFutures> tasks ... // 비즈니스로직 finally{ // shutdown 로직}}공통으로 executor 서비스를 관리하는 클래스를 만들어서 사용해야할까요? 우선 제가 개발한 환경에서는 executor service를 저만 사용했습니다.만약 위에 제가 작성한대로 methodA를 호출할 때마다 쓰레드 풀이 생성되는거 같은데 맞을까요? 이런 방식보다 더 효율적으로 쓰레드를 관리하고 정리할 수 있는지 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
tryLock 이후 InterruptedException 발생
락을 얻고 그 후에 InterruptedException이 발생 한다면 finally 에 unlock 을 작성 해 주어야 하나요 ?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
영한님, sleep(10) 이유가 궁금합니다.
안녕하세요. 영한님 궁금한 점이 있습니다.sleep(10) 를 하면 동시 실행을 더 촉진할 수 있다는 것이 이해가 안됩니다. 예를 들어, 아래를 가정한다면요! 각 시간은 별도로 가정한 것입니다. 1번 쓰레드가 1.0초에 먼저 실행이 된 후 0.1 초 쉬었다가 실행이 되면 1.1초에 실행 가정,2번 쓰레드가 1.1초에 먼저 실행이 된 후 0.1 초 쉬었다가 실행이 되면 1.2초에 실행 가정,3번 쓰레드가 1.2초에 먼저 실행이 된 후 0.1 초 쉬었다가 실행이 되면 1.3초에 실행 가정,... 그렇다면 각 쓰레드가 0.1초씩 쉬었다고 하더라도 결국에는 실행시점이1.1초, 1.2초, 1.3초 다 다르다고 봐도 되지 않나요?뭔가, sleep(10) 을 빠지게 되면 대부분 쓰레들이 비슷한 시점에 10ms 를 자고, 거의 동시에 깨어나서 increment() 를 실행하는 것 같은데 맞나요?맞다면 왜 그런가요? 감사합니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
i = 1 원자적 연산
안녕하세요. 좋은 강의 항상 감사합니다. for문으로 1부터 100부터 돌건데, 그 i 변수값(카운터)이 바깥의 공유 변수에 그대로 대입(이퀄 연산) 하는데. 이런 쓰레드가 있는데 100개가 있는데 동시에 같은 로직으로 동일한 공유 변수에 접근을 하는 상황이다. 더하기 연산을 하는 것이 아니다. 이 프로그램이 끝나면 이 공유변수에는 몇의 값 ?i = 1 처럼 원자적 연산일 경우, 멀티스레드 환경에서 문제가 되지 않는다고 하셨잖아요. 그러면 위의 상황에서도 무조건 100이 들어간다고 봐도 되죠?실제로 테스트 해봤을 때도 100이 계속 들어가긴 합니다. 감사합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
설정관련해 한번더 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.이렇게 코드 작성하는 부분에서도 설정차이가 있습니다 선생님과 같은 설정이였다가 갑자기 제가 잘못 눌러 밑과같이 변경되었습니다. 혹시 원래대로 설정할수 있을까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
영한님 ReentrantLock 대기상태 다시 질문드려요!
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]제가 멀티스레드와 동시성 관련해서 제대로 깊게 알아야할거같아서 다시복습으로 듣고있는데 예전에 질문했던 내용과 동일한거같아서 다시 질문드려요 ㅠ 그전에 처음 들어서 헷갈린부분이있었는데 다시들으면서도 설명한 부분이 맞나 싶어서요. 그전에 질문할때도 강의내용이 맞는지에 대한 질문이라 조심스러운부분이고 제가 잘못안다고 생각했는데 짚고넘어가면 좋을거같아서 다시 질문드립니다!이전 질문 링크: https://inf.run/t3Bbm71. 스레드의 대기 강의핵심 질문: 부분(13:30)강의에서 ReentrantLock 락 획득 실패시 대기큐에 WAITING상태라고 설명했는데 BLOCKED 상태가 가맞는지 검토필요.이부분에 대한 검토가 필요할거같고 제가 잘못알고있다면 참고해야할 링크를 주시면 감사하겠습니다. 아니라면 저처럼 이해하는데 오해의 소지가있는부분이 발생할것같습니다. 질문내용:부분(13:30)에서 대기1 락을 획득하기위한 대기큐에 대해서 설명해주셨고 lock()호출시에 이미 다른 스레드가 락을 획득시에는 WAITING상태로 대기하고 synchronized인 경우에만BLOCKED인거고 ReentrantLock은 WAITING 상태로 락획득을 대기큐에서 대기한다 라고 설명해주셧는데 이부분이 락이아닌 큐가 꽉차거나 완전히 비어있을때(특정 조건)는 RUNNABLE에서 await()사용해서 WAITING상태로 만들고 이걸 스레드대기공간(집합)에 넣고 추후 명시적으로 깨울수있게하는데, 락획득 실패시에는 BLOCKED상태로 락대기집합에 있는거고, 얻고나서 RUNNABLE상태에서 특정조건에 부합되지않을때(큐가 꽉차거나, 없을때) await를 써서 다시 WAITING상태로 스레드 대기집합에 넣는게 맞는거같아서 검토부탁드립니다.!그래서 이전강의 notify설명(synchronized 부분이긴하지만)에서도 WAIT -> BLOCKED 설명해주실때 WAIT이던애를 깨우면 바로 RUNNABLE이 되는게아니라 BLOCKED되는 설명부분이랑 ReentrantLock 역시 같은 원리가 맞는거같은데 이부분 다시 검토해주실수있나해서요ㅜ ReentrantLock 이라고해서 lock얻는걸 실패해도 WAITING이라는건 아닌거같아 검토해주시면 감사하겠습니다..!그리고 (17:40) synchronized의 경우 blocked일때는 interrupt로 깨우지못한다고했고(이부분설명은 맞는데)reentrantlock은 lockInterruptibly() 를 사용하면 가능하다고 했는데 이게 WAITING상태여서 가능하다기보단 lockInterruptibly이 BLOCKED상태인 스레드를 InterruptedException가 발생해서 blocked상태에서 빠져나오는게하는 기능인거 같은데 이부분도..reentrantlock역시 lock()만 사용으로는 못깨우고 이게 WAITING인거랑 좀 별게인거같아서 검토해주실수있을까해서요! 아래 참고 링크를 걸긴했는데 강의들 들으면서 사이클을 생각하다가 락을 획득할려다가 실패시 WAITING으로 대기한다라는게 원리상 아닐거같아서 찾아본게 oracle에서는 명시적으로 나타내진않았고 chat gpt에게 물어보면 제가 계속 waiting이 맞지않냐 blocked은 아니지않냐 공식문서 있냐 물어보면 명시적이진 않지만 유추할수있다 라고도 하고 그래서 결국 찾은 링크가 아래인데 공식은 아니고 블로그 내용이긴해서,, 한번더 영한님이 체크해주실수있을까해서요아래 chat gpt 답변과 블로그 링크에서 해당 내용부분 스샷도 일부 남길게요! https://blog.ycrash.io/java-suspended-thread-states-blocked-waiting-timed_waiting/?utm_source=chatgpt.com------질문을 남기니 그때처럼 인프런ai가 답변했는데 저 내용이 맞는거같아서요!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
설정관련질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.단축키를 누르다 실수로 어떤키를 잘못누르게 되어서 상단에있는 최근에 열어본 창이 보이지 않게 되었습니다. 예를 들면 StartTestMain.javaHelloThread.java 등등 켜져있는창이 보이지 않습니다 기존 설정으로 다시 돌아가고 싶은데 어떻게 해야할까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
공부 방향이 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]김영한님의 강의를 들으며 꾸준히 공부하는 한 직장인입니다. 현재 로드맵이 나눠져 있는데 혹시 이제까지 나온 김영한님의 모든 강의를 포함하는 로드맵을 추천해 주실 수 있을까요??
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
.close()이후 poolSize문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]21 버전의 자바를 사용 중입니다. .close()를 하여도 pool의 개수가 0개로 변경되지 않습니다.main 스레드에서 인지하는데 시간이 걸리나 하여 sleep()을 통해 시간의 변화를 줬지만 여전히 동일한 결과값이 도출됩니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
인터럽트 상태에 대하여
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 인터럽트 - 시작 2 강의를 수강하다 궁금한 점이 생겨 여쭤보게 되었습니다. 강의 내용 중 'work 스레드는 TIMED_WAITING 상태에서 RUNNABLE 상태로 변경되고 InterruptedException 예외를 처리하면서 반복문을 탈출한다.work 스레드는 인터럽트 상태가 되었고, 인터럽트 상태이기 때문에 인터럽트 예외가 발생한다.인터럽트 상태에서 인터럽트 예외가 발생하면 work 스레드는 다시 작동하는 상태가 된다. 따라서 work 스레드의 인터럽트 상태는 종료된다. work 스레드의 인터럽트 상태는 false로 변경된다.' 부분에 대해 여쭤보고 싶습니다.전반적인 내용은 이해가 되는데, '상태' 라는 표현에 대해 이해가 잘 되질 않습니다. 앞 부분 스레드 생명 주기에서 스레드의 상태는new, runnable, blocked, waiting, timed_waiting, terminated가 있다고 학습했는데, 여기에서 나오는 '인터럽트 상태'는 스레드의 생명 주기에 등장하는 상태와는 독립적으로 봐야하는 상태일까요 ? '인터럽트 상태'가 스레드의 생명 주기에서 등장하는 스레드의 상태 중 하나인지 혼동되어 여쭤봅니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
스레드 실행 순서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]public class ManyThreadMainV2 { public static void main(String[] args) { log("main() start"); HelloRunnable runnable = new HelloRunnable(); for(int i=0; i<100; i++){ Thread thread = new Thread(runnable); thread.start(); } log("main() end"); } }안녕하세요, 여러 스레드 만들기에서 반복문을 사용하여 스레드를 생성하면 콘솔에 스레드의 실행 순서가 보장되며 출력이 됩니다. 사진처럼 몇 번을 다시 수행해도 Thread0, 1, 2 ... 98, 99로 강의와 다르게 순서가 항상 일정하게 출력되는데 혹시 무엇이 문제인지 알 수 있을까요 ?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
교안 오타인지 확인 부탁드립니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.교안 7. 고급 동기화 - concurrent.Lock.pdf 중 7페이지두번째 줄Thread.park(), Thread.parkNanos(long millis) -> LockSupport.park(), LockSupport.parkNanos(long millis)수정되는 것이 맞는 내용 같은데 확인 부탁드립니다!제가 잘못 알고 있다면, 다시 학습하겠습니다 :)
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
yield() 호출
안녕하세요 좋은 강의 감사합니다. package thread.control.printer; import java.util.Queue; import java.util.Scanner; import java.util.concurrent.ConcurrentLinkedQueue; import static util.MyLogger.log; public class MyPrinterV4 { public static void main(String[] args) { Printer printer = new Printer(); Thread printerThread = new Thread(printer, "printer"); printerThread.start(); Scanner userInput = new Scanner(System.in); while (true) { log("프린트할 문서를 입력하세요. 종료 (q): "); String input = userInput.nextLine(); if (input.equals("q")) { printerThread.interrupt(); break; } printer.addJob(input); } } static class Printer implements Runnable { Queue<String> jobQueue = new ConcurrentLinkedQueue<>(); @Override public void run() { while (!Thread.interrupted()) { if (jobQueue.isEmpty()) { Thread.yield(); // 추가 continue; } try { String job = jobQueue.poll(); log("출력 시작 : " + job + ", 대기 문서: " + jobQueue); Thread.sleep(3000); log("출력 완료"); } catch (InterruptedException e) { log("인터럽트!"); break; } } log("프린트 종료"); } public void addJob(String input) { jobQueue.offer(input); } } }위의 코드에서요 yield() 의 의미와 취지는 알겠으나, 수업에서 말씀주셨던 위의 코드에서는 결국 printerThread 쓰레드 1개잖아요? (다른 쓰레드는 main) 그래서 yield() 를 넣더라도 다른 쓰레드에 양보할 쓰레드가 없는 것 아닌가요? (코어 갯수랑 별개로요) 감사합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
교안 오타인가요?!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강사님 강의 잘 듣고 있습니다!!혹시 7. 고급동기화 교안 부분 parkNanos()에서 millis가아니라 ns아닌가요?!!그리고 작은 오타하나도 말씀드립니당:)
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
교안 오타 일까요?
map1의 결과가 뭔가 벨류값이 2, 3이 바뀐거같네요.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
9:06초에서 이해가 안가는 부분 (unlock)
비공정 모드에서는 스레드 경쟁 상태가 되어 어떤 스레드가 락을 획득 할 지 보장이 안되는건 이해가 됐습니다.다만 교안에는 이미지 처럼 하나 깨운다 라고 되어있는데, 그러면 경쟁 상태가 의미가 있는지요?한번에 여러 스레드가 unpark되는게 아니라면 왜 레이스 컨디션 문제가 발생하는지 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
interrupt 에 대하여
안녕하세요 강사님! 간단한 질문이 있습니다!!shutdown 이나 shutdownNow 모두 작업중이 스레드에게 Interrupt 를 거니까, 100초 짜리 작업이 interrupt 체킹이 안되어있는 스레드였다면(sleep 함수가 아니라 실제로 작업이 100초짜리 걸려서, Thread.isInterrupted 같은걸로 체크가 없다면) (sleep 은 interrupt 를 잡음)shutdownNow 에도 동작을 안하나요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
스레드 대기 ReentrantLock 설명부분
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서 ReentrantLock의 대기큐에서 관리할때 BLOCKED가아닌 WAITING에서 락획득을 대기한다고했는데 찾아봤을때 lock.lock()실행시에는 락을 얻기위해서 BLOCKED 상태이고 condition.await()실행되어야 WAITING상태로 기다리는걸로 알고있는데 혹시 잘못된 강의설명인지 궁금합니다.