묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
sleep(10)을 넣은 이유가 궁금합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 중 sleep(10) 코드를 넣고, 계산 속도가 너무 빨라서 , 다른 스레드와 동시 실행을 위해 잠깐 쉬었다가 실행을 한거라는데 이게 이해가 잘 안됩니다 제 생각엔 빨리 실행되어야 여러 스레드들이 동시에 공유변수 value에 접근해서 동시 실행될때가 많을 것 같은데, 왜 잠깐 쉬었다가 실행해야 더 충돌 횟수가 많아져서 result가 낮은 값이 나오는지 모르겠습니다. sleep(10)을 하면 실행 속도가 느려져서 오히려 경쟁 상태가 완화되어야하는거 아닌가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
BoundedQueueV3에서 notify()에 대한 궁금증
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]다수의 생산자와 소비자 스레드를 실행하는 환경에서 소비자 스레드와 생산자 스레드가 waiting이 되어 있는 경우,한 생산자 스레드가 lock을 얻어 notify()를 실행하는 경우, WAITING이던 스레드가 BLOCKED가 되는데소비자 스레드가 lock을 얻어 데이터를 사용한다는 보장이 되는 걸까요? 다른 생산자 스레드가 lock을 얻고 버퍼에 데이터를 가득채우는 경우도 발생할 수 있을 것 같아 궁금합니다!결론적으로, 소비자는 생산자를 깨우고, 생산자는 소비자를 깨워야만 하는데 이를 notify()로 보장해줄 수 있는 지 궁금합니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
메모리 가시성 문제가 싱글코어에서도 발생할 수 있나요?
메모리 가시성에 대한 그림 예시에는 코어가 2개인 멀티 코어로 되어있어서 싱글코어인 상황도 궁금해졌습니다. 코어당 캐시 메모리가 있으니까 여러 스레드들이 같은 캐시 메모리에 접근하므로 메모리 가시성 문제가 발생하지 않을 것 같은데 , 싱글 코어에서도 가시성 문제가 발생하는지 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
synchronized와 메모리 가시성
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강사님!캐시 메모리에서 값이 변경이 되어도 메인 메모리에 언제 값이 적용될지 모르는건데 synchronized를 사용하면 메인 메모리는 무조건 값이 메인 메모리에 반영이 되는 걸까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Executor 스레드 작업 처리 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]스레드 풀과 Executor 프레임워크 강의1, 2를 듣고 공부하던 중에 task가 <큐에 담긴 후 | 큐에 담기지 않고> 스레드가 작업을 처리하는 것의 기준을 정확히 이해했는지 궁금하여 질문드립니다. 12강 CallableMainV2 예제의 실행 결과 분석에서 executorService에 taskA 작업을 submit()으로 요청하면, "Future 가 만들어지고, taskA 를 감싸고 있는 Future 가 블로킹 큐에 담긴 후에 큐에 들어있는 Future[taskA] 를 꺼내서 스레드 풀의 스레드1이 작업을 시작한다고 하셨습니다." 13강의 PoolSizeMainV1 예제의 실행 결과 분석에서는 task1 작업 요청을 하면"작업을 처리하기 위해 스레드를 하나 생성했기 때문에 작업을 큐에 넣을 필요 없이, 해당 스레드가 바로 작업을 처리한다." 라고 하셨습니다. 12강 예제에서는 요청을 받기 전에 WAITING 상태의 스레드가 존재하였고, 작업을 수행하기 위해서는 WAITING 상태의 스레드를 깨워야하기 때문에 블로킹 큐에 task가 담겨야 하고, 13강 예제에서는 task 요청이 오자 task를 수행하기 위한 새로운 스레드가 생성되었고, 스레드를 깨우지 않아도 바로 task를 실행할 수 있기 때문에 블로킹 큐에 넣을 필요가 없다 이렇게 이해하면 되는지 궁금합니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
메인 메모리 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]volatile를 통해 메인 메모리에서 값을 바로 확인 하는건데 그러면 메모리는 어떻게 값이 변경 되는 것을 알 수 있는 건가요?메인 메모리에서 값이 변경이 안되면 volatile을 사용해도 변경 된 걸 알 수 없는거 아닌가요?제가 너무 깊게 들어간걸까요...ㅜㅜ... 운영체제?를 공부해야 되는 부분일까요??,,
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[오타 제보] pdf 13장 정리 부분
[오타 제보]대상 강의록: 13. 스레드 풀과 Executor 프레임워크2.pdf위치: p.49대상 문단: 밑에서 3번째 "그래서 일반적인 상황이라면 ~ ..."수정 전(1): 한번에 처리할 수 있는 수를 제안하고 안정적으로 처리하고 싶다면 ...수정 후(1): 한번에 처리할 수 있는 수를 제한하고 안정적으로 처리하고 싶다면 ...--수정 전(2): 그러다가 일반적인 상황을 벋어날 정도로 ~ ...수정 후(2): 그러다가 일반적인 상황을 벗어날 정도로 ~ ... 이번 강의도 잘 들었습니다. 양질의 강의 제공에 감사드립니다! 저랑 너무 잘 맞는 강의스타일 입니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
interrupt() 호출 질문 입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요! interrupt() 호출 시점에서 TIMED_WAITING → RUNNABLE로 전환될 때 "run 작업중" 로그가 찍히는 건가요?"작업 중단 지시"가 찍히지 않는 이유는 sleep() 실행 중 InterruptedException이 발생해서 catch를 타는건가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
try-catch-finally를 사용해서 finally { notify() } 를 하지 않는 이유?
예제 3번 코드를 보다 의문이 들어 질문드립니다.코드를 보면,@Override public synchronized void put(String data) { // 버퍼가 가득 찬 경우, 빌 때까지 주기적으로 체크 while (queue.size() == max) { log("[put] 큐가 가득 참, 생산자 대기"); try { wait(); log("[put] 생산자 깨어남"); } catch (InterruptedException e) { throw new RuntimeException(e); } } queue.offer(data); log("[put] 생산자 데이터 저장, notify() 호출"); notify(); // WAIT -> BLOCKED }에서 인터럽트 예외가 발생하면 밑의 notify() 코드가 호출이 되지 않습니다.이 문제 상황에서 한 스레드라도 notify()문을 호출하지 않게되면 영원히 대기 중인 스레드가 생겨서 정상적인 프로그램 종료가 일어나지 않을 것 같습니다. 그래서 제 생각은 notify() 메서드를 finally문으로 감싸줘야 한다고 생각하는데 이게 맞는지 궁금합니다.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
prestartCoreThread()와의 차이점, active 카운트
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 해당 강의와 관련된 내용을 학습하던 중에 prestartAllCoreThreads()외에도 prestartCoreThreads()라는 메서드가 존재하는 것을 확인했습니다.제가 인지한 두 메서드의 차이점은 다음과 같습니다.|메서드 |prestartAllCoreThreads()|prestartCoreThreads()| |---------------|------------------------|---------------------| |생성되는 스레드 수 |전체 코어 스레드 수 |1개씩 | |생성된 스레드의 상태|active 아님 |active |여기서 후자의 경우 1개씩 생성한다는 점은 이해가 가는데, 왜 두 메서드의 경우에서 생성한 스레드의 상태가 active냐/아니냐로 차이가 나는지는 모르겠습니다.챗지피티와 이에 대해서 대화를 좀 나눴는데 그 내용도 이해가 되지 않습니다.다수의 스레드가 동시에 getTask()를 호출하면 모두 블로킹 상태가되어 락을 기다리지 않기 때문에 active 카운트가 증가하지 않는다.. 라고 하는데 이해가 가지 않습니다. 실행 결과// case1. 생성된 스레드가 active 상태가 아님 poolExecutor.prestartAllCoreThreads(); printState(executorService); //15:31:40.628 [ main] [pool=1000, active=0, queuedTasks=0, completedTasks=0 // case2. 생성된 스레드가 active 상태임 poolExecutor.prestartCoreThread(); printState(executorService); //15:17:53.579 [ main] [pool=1, active=1, queuedTasks=0, completedTasks=0
-
해결됨자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
instance.getMyField()의 값이 왜 다른가요?
AtomicIntegerFieldUpdater 기본 구현 페이지의 코드에서마지막 System.out.println() 부분을 보면은 new value라고 하고 instance.getMyFiled()를 하고Updated value에도 instance.getMyFiled()를 합니다그런데 옆에 주석에 new value는 42, updated value는 43으로 나오는데 실제로 실행해보니 저는 둘 다 43으로 나오더라구요 표기 오류가 맞는거겠죠?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[오타 제보] 13. 스레드 풀과 Executor 프레임워크2
[오타 내용]대상 강의록: 13. 스레드 풀과 Executor 프레임워크2.pdf대상 위치: p.2 close() 부분오타 내용변경 전: close() 는 자바 19부터 지원하는 서비즈 종료 메서드이다변경 후: close() 는 자바 19부터 지원하는 서비스 종료 메서드이다
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
스레드 작업 수행중 Ctrl + C 입력을 통한 인터럽트 명령이 제 생각대로 수행되지 않습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[소스 코드 다운로드 링크]https://drive.google.com/file/d/1c0QnKniulwUHetmd8iRalCwtm1o3RxSf/view?usp=share_link[질문 내용]질문 대상 소스 코드: NewOrderService.java - line 30 제 생각: 스레드들이 작업을 수행중일 때 (mac 기준) ctrl + c를 누르면 키보드 인터럽트가 발생하여 catch block에 잡혀서 line 31의 log("일부 작업이 실패했습니다."); 코드가 수행될 것이라고 예상했습니다. 하지만 ctrl + c를 입력하더라도 예외는 발생하지 않고, 스레드들이 정상적으로 처리되는 것이 실제 흐름이었습니다.질문 1-1. ctrl + c 입력은 인터럽트인가요?질문 1-2. 만약 1-1에 대한 답변이 yes라면, 시스템 상의 인터럽트(?)는 맞지만 자바 프로그램 상의 인터럽트는 아닌 것인가요?질문 1-3. 만약 1-1에 대한 답변이 yes라면, 이는 터미널 상에서만 입력 가능한 인터럽트이고, 인텔리제이에서는 불가능한 입력인가요?질문 2. (인텔리제이에서) 자바 프로그램에 대해서 예외를 일부러 발생시키려면 throw new IllegalStateException(); 등과 같이 코드를 통해서만 가능한가요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
해당 강의 내용 무단 도용 신고
ReentrantReadWriteLock.wirteLock() 설명 중[읽기 락은 쓰기 락과 독립적으로 소유되므로 영향을 주지 않지만 현재 스레드가 읽기 락도 획득한 상태에서 조건 대기 메서드를 호출하는 것은 사실상 항상 오류이다. 왜냐하면 대기를 해제할 수 있는 다른 스레드도 쓰기 락을 획득하지 못할 수 있기 때문이다.]와 같은 설명이 readLock( ).lock( )을 실행한 상태에서, newCondition( )의 메서드를 사용하면 오류가 발생하는 것인지 궁금하여 구글링을 하던 중 아래와 같은 사이트를 발견하였습니다. https://jaimemin.tistory.com/2411블로그에 들어가보면, 강사님의 자료를 수정없이 모든 내용을 예제까지 포함하여 작성되어 있고, 또한 광고를 붙여 수익을 얻고 있는 것으로 확인되었습니다. 엄연히 지적재산권이 있는 유료 강의를 타인이 무단 도용하여 수익을 창출하고 있는 행태는 도의적으로 아니지 않나 생각이 들어 알려봅니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
개발자는 기본기가 중요하다
실무에서 개발좀해보닌깐 느꼇는데 개발자는 기본기가 매우매우매우매우매우중요하다. 갓영한님도 그걸 아시기 떄문에 왜써야하고 어떤문제가있고 그러면 어떻게 해결하고 어떻게 개선하는지를 스텝바이스텝으로 보여주신다. 묻따 기본기룰 챙기고 항상 교차검증을 하는 마인드로 개발을 했으면 좋겟다 -어느 흔한 개발자의 주저리 글-
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
시분할과 스케줄링
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]얼마만큼 실행될지는 운영체제가 결정하는것을 스케줄링인데 그럼 스케줄링이 실행되고나서 시분할이 적용되는 방식인가요?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[오타 제보] 11. 동시성 컬렉션.pdf 14페이지
[오타 내용]대상 강의록: 11. 동시성 컬렉션.pdf 대상 페이지: p.14 첫 번째 그림에 대한 설명 중 마지막 부분내용기존: 클라이언트인 test() 입장에서 ... (중략) ... BasicList의 어떤 구현체든지 다 받아들일 수 있다.변경: 클라이언트인 test() 입장에서 ... (중략) ... SimpleList의 어떤 구현체든지 다 받아들일 수 있다.강의 잘 듣고 있습니다!
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
문제와 풀이2번 궁금증
영한님 안녕하세요. 문제와 풀이 2번을 풀고 고민하고 강의를 학습해도 약간의 의문점이 생겨서 질문드립니다. Thread t1 = new Thread(new MyTask(), "t1"); Thread t2 = new Thread(new MyTask(), "t2"); Thread t3 = new Thread(new MyTask(), "t3"); t1.start(); t2.start(); t3.start(); // 1초 t1.join(); t2.join(); t3.join(); // 대기현재 위와 같은 코드에서 main 쓰레드가 t1, t2, t3에게 작업을 시킵니다. 그리고 t1의 join을 만나니까 t1이 작업이 완전히 끝날때까지 대기상태에 빠집니다. 그리고 t1이 작업이 완료되면 t2.join()이 실행된다면 결과가 아래와 같이 나와야 하는데 왜 이렇게 안 되는지 의문입니다. ㅠㅠt1: 1t1: 2t1: 3t2: 1t2: 2t2: 3...
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
오타 있습니다
강의 자료 : 8. 생산자 소비자 문제1.pdf43페이지큐가 가득 찾을 때 -> 큐가 가득 찼을 때
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[오타 의심 제보] 강의 6:11 부분
오타 여부가 확실하지는 않지만, 제가 생각했을 때 오타가 아닌가 싶어서 제보합니다.영상 위치: 6분 11초강의록 위치: p.24 - 스레드 종료 규칙오타 의심 내용:원본: 예를 들어, thread.join() 호출 전에 thread의 모든 작업이 완료되어야 하며, ...수정: 예를 들어, thread.join() 리턴 전에 thread의 모든 작업이 완료되어야 하며, ...의견: thread.join()을 호출하면, thread가 모든 작업을 마친 후에 void로 리턴하고 난 뒤에야 thread.join() 다음에 있던 코드들을 수행하는 것이니까 리턴이 적절한 단어 아닌가 싶습니다.