학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 강사님 강의 잘 듣고 있습니다!! 혹시 7. 고급동기화 교안 부분 parkNanos()에서 millis가아니라 ns아닌가요?! ! 그리고 작은 오타하나도 말씀드립니당:)
비공정 모드에서는 스레드 경쟁 상태가 되어 어떤 스레드가 락을 획득 할 지 보장이 안되는건 이해가 됐습니다. 다만 교안에는 이미지 처럼 하나 깨운다 라고 되어있는데, 그러면 경쟁 상태가 의미가 있는지요? 한번에 여러 스레드가 unpark되는게 아니라면 왜 레이스 컨디션 문제가 발생하는지 궁금합니다.
안녕하세요 강사님! 간단한 질문이 있습니다!! shutdown 이나 shutdownNow 모두 작업중이 스레드에게 Interrupt 를 거니까, 100초 짜리 작업이 interrupt 체킹이 안되어있는 스레드였다면 (sleep 함수가 아니라 실제로 작업이 100초짜리 걸려서, Thread.isInterrupted 같은걸로 체크가 없다면) (sleep 은 interrupt 를 잡음) shutdownNow 에도 동작을 안하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 스레드 풀 로그 관련 얘기하셨는데 스프링 강의에서 엑츄에이터.그라파나 얘기를 한적 있다고 하는데 어느 강의에서 어느 부분인가요?
안녕하세요 강사님 🙂 너무너무 잘 듣고 있습니다. 좀 바보같은 질문일 수도 있는데, CPU 가 하드웨어적으로 다른 스레드의 접근을 막고 한 연산 안에서 "값 확인, 값 변경" 을 진행한다고 이해했습니다. 혹시 멀티코어에서 더라도 별다른 문제가 발생하진 않나요? 가령 두 하드웨어가 연산을 따로따로 하며 서로를 인식하고 있지 않으니까, 동시에 "한 연산"을 수행해서, "값 확인 및 변경" 역시 정확히 동시에 진행된다면 충돌이 나지 않을까? 싶은 생각이 들었습니다. 제가 잘 못찾은건지 질문이 말도 안되는건진 모르겠지만 찾아봐도 잘 나오질 않아서, 질문을 드려보게 되었습니다 ㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의에서는 키워드 synchronized 를 메서드 앞부분에 붙여 동기화를 구현하는데, 롬복의 @Synchronized 다른 점이 무엇인지 궁금합니다. 그리고 실무에서는 둘 중 어느 방법을 사용하는지도 궁금합니다!
synchronized, ReentrantLock, Atomic 모두 상호배제(동기화)를 구현하지만, 락을 "획득하고 해제하는 과정" 자체도 동시 접근이 발생할 수 있는 또 다른 임계영역처럼 보입니다. → 그렇다면 이 락 자체 또한 어떻게 동기화하는지 궁금합니다. 핵심적으로, synchronized JVM이 모니터 락을 통해 상호배제를 구현하는데 내부적으로 CAS 연산 + OS의 스레드 대기 관련 시스템 콜 + JVM 내부 스레드 대기 큐 을 활용 상호배제를 구현한다. 즉, 락 획득과 해제 과정의 동기화는 JVM 수준에서 구현 한 것이다. OS는 단지 스레드를 잠재우고 깨우는 역할만 담당 → 이 이해가 맞는지? ReentrantLock 자바에서 명시적으로 CAS 연산 + OS의 스레드 대기 관련 시스템 콜 + 스레드 대기 큐 을 활용하여 상호배제를 구현한다. 즉, 락 획득과 해제 과정의 동기화는 자바 코드 수준에서 직접 구현 한 것이다. OS는 단지 스레드를 잠재우고 깨우는 역할만 담당 → 이 이해가 맞는지? Atomic 자바에서 명시적으로 CAS 연산 활용하여 상호배제를 구현한다. 즉, 락이 없고, 시스템콜도 없다. CAS 한 줄이 동기화의 전부 → 이 이해가 맞는지?
학습적으로 필요한 질문은 아니긴 하지만.. 100% 궁금해서 질문 드리는데요! 필요한 대부분의 기능을 미리 만들어서 제공하는 라이브러리에서 학습 중 직접 작성한 shutdownAndAwaitTermination 메서드 같은건 왜 공식적으로 만들어 제공하지 않은걸까요? 좀 충격? 적인건 라이브러리에 구현방법을 주석까지 남겨가며 제안했다는 건데요... 저걸 왜 그냥 메서드로 만들어두지않고 제안만 한걸까요? 구조적인 문제가 생기는걸까요? 너무 궁금하네요...ㅋㅋ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 위 예제에서 main() 메서드가 InterruptedException을 던져버렸는데, 프로그램이 오류 로그를 띄우지 않고 정상 결과를 출력합니다. 왜 프로그램이 다운되지 않는지 궁금합니다. 원래 main() 메서드 밖으로 오류가 나가면 프로그램이 다운되니 무조건 main() 메서드 선에서 모든 오류를 처리해야 하는 것 아니었나요? 이 runnable을 상속 받을 스레드는 run() 메서드로 런타임 오류를 생성해 밖으로 던져버립니다. 그럼 그 스레드를 호출한 외부 스레드인 main() 스레드로 런타임 오류가 전달되어야 하는 것 아닌가요? 만약 main() 스레드로 가지 않는다면 한 스레드에서 던진 오류는 대체 어디로 가나요? 어디에서 무엇이 그 오류를 처리하는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 정적 중첩 클래스에서 스레드를 정의한 후 main() 메서드에서 해당 스레드를 생성한 후 종료하는 예제입니다. 그런데 이 스레드의 run() 메서드를 보면 catch에서 런타임 오류를 생성한 후에 던집니다. 1. 발생한 오류는 체크 오류인데 굳이 런타임 오류를 새로 생성해서 던진 까닭은 단순히 InterruptedException 발생을 강조해서 알리기 위함인가요? (오류 로그를 남기듯이 오류 발생 흔적 남기기?) 2. run() 메서드에서 런타임 오류를 생성해서 던졌고 main() 메서드에는 이에 대한 별도의 오류 처리 과정이 없습니다. 그런데 왜 메인 메서드가 터지지 않고 정상 결과를 출력할 수 있는 건가요? 오류 처리 코드가 없으면 런타임 오류는 자동 던지기 처리돼서 메인 메서드 밖으로 오류 나가버리고 프로그램 다운돼야 하는 상황 아닌가요...?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. AI의 답변을 받았으나, 여전히 이해가 가지 않아 재질문 올립니다ㅠㅠ 이 예제에서 Thread.sleep(3000);으로 인한 InterruptedException e를 catch한 후에 왜 log("sleep() end");~log("end");가 마저 출력되는지 잘 모르겠습니다. 예외가 발생하면 try 코드 본문을 빠져나가 catch로 이동하면서 try의 나머지 코드는 출력 안 되지 않나요? 예외를 잡으면 정상 흐름을 반환한다고는 하지만, 다시 실행되는 정상 흐름에 나머지 try 코드는 포함이 안 된다고 알고 있습니다...ㅠ 혹시 제게 오개념이 생겼나 싶어서 Java-Mid1의 오류 처리 파트를 다시 총 복습하고 와도 여전히 이해가 가지 않습니다. 답변 감사드립니다...ㅠ ps. 혹시 몰라서 제 의문을 가중시킨 Java-Mid1 강의의 예제 코드를 추가합니다. 아래의 예제에서는 send()에서 오류 발생 시에 try{}를 빠져나가서 disconnect();가 호출이 안 된다고 합니다ㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 멀티스레드와 동시성 강의-스레드 생명주기 파트에서 질문 드립니다. Thread.sleep(3000)으로 InterruptedException이 발생했고, catch로 그걸 잡았는데 왜 sleep()으로 다시 돌아가서 다음 로그가 출력되는 등 정상 흐름이 마저 진행되나요? 체크 예외가 발생하면 그걸 catch로 잡더라도 이후 코드는 마저 실행되지 않아 finally 코드가 도입된 것이 아니었나요? java-mid1에서 체크 예외가 발생해 나머지 코드가 실행되지 않아 자원 정리가 안 되었던 예제를 배웠던 것 같은데, 이 예제와 무슨 차이가 있어서 다른 결과가 나오는지 궁금합니다ㅠㅠ 2. 이 예제에서 InterruptedException이 발생해서 그걸 catch한 것까지는 이해됩니다. 그런데 왜 굳이 새 RuntimeException을 생성해서 또 던지는 건가요? InterruptedException 이외에 추가로 발생할 지도 모르는 다른 예외들도 한꺼번에 잡아서 던지려는 의도인가요(예방 차원)? 3. 예외를 어떤 경우에 잡고 어떤 경우에 던져야 하는지 궁금합니다. java-mid1 예외 처리 파트에서 예외를 못 잡으면 던지고 잡을 수 있으면 잡아야 한다고 배웠는데, 그 구체적인 기준을 잘 모르겠습니다. 그걸 배울 당시에는 '아직 기초 단계라 기본 개념만 잡고 자세한 오류 해결 과정은 나중에 나오나 보다'하고 넘겼는데, 이 예제에서도 그냥 catch(발생한 오류) 정도로 넘어가는 걸 보니 제가 뭔가 놓치고 있는 것 같습니다. 그냥 catch()코드를 넣으면 오류를 잡았다고 자바 상에서 처리가 되는 건가요? 그런 거면 그냥 오류를 다 catch로 잡아버리면 될 것 같은데, 굳어 던져야 하는 상황은 어떤 상황인가요...? 질문이 너무 길어졌네요. 친절한 답변에 미리 감사드립니다!!!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] Thread 의 yield 함수에 대해서 질문드립니다 . 양보를 할지 말지 에 대한 hint만 주는것이고 스케쥴링이 알아서 양보 여부에 대해 정한다고 하셨는데 만약에 양보를 하게되면 que의 제일 뒤로 가게 되는건가요? 만약에 que에 10개의 일이 쌓여있으면 양보를 하게되면 10개가 다 끝나고 실행 되는 건지 아니면 1~~n개가 실행되고 그다음에 실행 되는 건지는 모르는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요! 항상 좋은 강의 감사드립니다. BlockingQueue는 스레드가 동시에 접근하였을때 동시성 제어를 위한 자료 구조인데 세마포어 개념도 동시에 스레드가 접근 하였을때 가능한 스레드 수를 제어하는 개념인 것을 공부하였습니다. 어떤 상황에서 BlockingQueue 를 쓰고 어떤 상황에서 세마포어를 쓰는게 더 좋을까요? 락을 획득하였을떄 Queue 는 FIFO 구조이므로 순서를 보장해주고 싶을 떄 BlockingQueue 를 쓰는게 좋나요? 세마포어는 스레드가 직접 자원을 획득하기 전까지 기다리니까 동기이고 비동기는 큐에 넣고 다른 일을 하러 가는 즉 호출한 함수가 처리 결과를 기다리지 않는 비동기여서 동기/ 비동기 차이를 구분하고 싶을때 쓰는게 둘을 구분해서 쓰는게 좋을까요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 안녕하세요, 강의 수강 중 질문이 생겨 여쭤보게 되었습니다. 스레드의 생명 주기 - 코드 강의 파트에서 Thread.sleep(1000);를 입력하여 메인 스레드를 잠시 멈추는데, 메인 스레드의 이름이 Thread라서 Thread.sleep을 하는 것일까요 ? 아니면, sleep 메서드가 static이어서 이렇게 사용되는지 궁금합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 1. 여러 스레드가 정말 완벽하게 동시에 실행되는 경우 임의의 두 스레드 A, B가 정말 완벽하게 동시에 실행되었다고 가정하겠습니다. 현재 atomicInteger의 value가 0에서 1로 증가해야하는 상황입니다. A와 B 모두 getValue의 값은 0입니다. A와 B 모두 result의 값은 true가 될 것이며 getValue는 0에서 1로 증가합니다. A와 B 모두 1을 return 합니다. (결괏값: 1) 이런 경우는 절대로 없는 건가요? 2. sleep 사용 시 타 스레드 간섭이 증가하는 이유 sleep 사용 시 타 스레드 간섭이 증가하는 이유를 제 나름대로 생각해 보았는데, sleep(100)이라 하더라도 모든 스레드가 100ms 후에 완벽하게 동시에 깨어나지는 않기 때문일까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 해당 강의를 듣고 질문이 있는데요, 우리가 일반적으로 자바/스프링부트 프로젝트를 맥북으로 인텔리제이로 실행한다면 어떻게 프로세스가 이루어지는지 알 수 있을까요? 제가 생각해본건 아래와 같습니다. 프로세스 1 자바 (강의 내용중에, 자바를 실행하면 자바도 하나의 프로세스라고 하셔서 추가했습니다) 프로세스 2 JVM (그리고 이 JVM이 가상 컴퓨터이니까 그 컴퓨터의 프로세스 내부에서 스프링부트가 실행된다고 생각하고 있습니다!) 프로세스 3 인텔리제이 이렇게 생각하고 있는 게 맞는 내용일까요??
처음 예제 작성했을 때 출력 결과가 이렇게 나왔었는데, (강의 5분 10초, 10분 50초 참고) work] 작업 중 work] 작업 중 main] 작업 중단 지시 thread.interrupt() work] work 스레드 인터럽트 상태2 = false main] work 스레드 인터럽트 상태1 = true work] interrupt message=sleep interrupted work] state=RUNNABLE work] 자원 정리 work] 작업 종료 이 상황에서는 main스레드에서 interrupt() 후 바로 work 스레드가 예외 처리해서 work 스레드의 인터럽트 플래그가 false 로 됐다는 걸 확인할 수 있습니다. 하지만 그 이후 main스레드에서 work 스레드의 인터럽트 플래그가 true가 출력되었는데 어떻게 false가 아닌 true가 출력될 수 있는지 궁금합니다.