묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 고급 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의 어떤 구현체든지 다 받아들일 수 있다.강의 잘 듣고 있습니다!
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
table view 없음
show library 에 table view가 없는
-
해결됨김영한의 실전 자바 - 고급 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페이지큐가 가득 찾을 때 -> 큐가 가득 찼을 때
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
NamedLock 테스트 실패
안녕하세요 상용님 좋은 강의 너무 잘 듣고 있습니다.namedlock부분에서 테스트 코드를 돌리는데 connectiontimeout 이후 테스트가 실패하여 질문 드리려 합니다.문제상황maximum-pool-size를 40으로 설정 후 테스트를 돌리면 다음과 같은 에러가 터지면서 테스트가 실패합니다. 사진에서와 같이 40개 스레드가 락획득을 시도한 후, 30초 후 락획득 시도조차 하지못한 60개의 스레드에서 타임아웃이 납니다.이후 락 획득을 기다리던 스레드하나가 타임아웃이 나고 나머지 스레드들이 39번의 재고 감소 로직을 실행합니다.추측제가 추측한 것은 다음과 같습니다.1. 현재 transactional propagation requiresnew로 되어있기에 하나의 재고 감소 로직 당 2개의 connection을 필요로한다.2. 처음 40개의 스레드가 순차적으로 lock획득을 시도하며 40개의 스레드를 점유한다.3. requires new로 새로운 트랜잭션을 시작하기 위해 새 connection이 필요하지만, 여유분이 없어 기다린다.(이때 데드락 상황)4. 30초 대기후 timeout이 나서 커넥션들이 순차적으로 반환된다.5. 이때 락을 획득 시도한 스레드(커넥션 점유중)가 반환되면6. 나머지 39개의 락획득 시도하던 스레드들이 실행된다.그래서 실제로 maximum pool size를 101개로 올리니 잘 실행되었습니다.그런데 선생님은 40개로도 실행이 되어서.. 의문이 남습니다.질문저의 추측이 맞을까요..? 틀리다면 어디가 틀린걸까요.왜 선생님은 40으로만으로도 된것인가요?이런 이유에서 강의 중에 datasource를 분리하라 하신걸까요?혹시 몰라 코드 첨부합니다.!
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[오타 의심 제보] 강의 6:11 부분
오타 여부가 확실하지는 않지만, 제가 생각했을 때 오타가 아닌가 싶어서 제보합니다.영상 위치: 6분 11초강의록 위치: p.24 - 스레드 종료 규칙오타 의심 내용:원본: 예를 들어, thread.join() 호출 전에 thread의 모든 작업이 완료되어야 하며, ...수정: 예를 들어, thread.join() 리턴 전에 thread의 모든 작업이 완료되어야 하며, ...의견: thread.join()을 호출하면, thread가 모든 작업을 마친 후에 void로 리턴하고 난 뒤에야 thread.join() 다음에 있던 코드들을 수행하는 것이니까 리턴이 적절한 단어 아닌가 싶습니다.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[코드 공유] yield() 유무에 따른 체크 로직 수행 횟수를 확인할 수 있는 코드 공유합니다.
[비교 결론](맥북 프로 2018형 기준)yield() 사용 X: 체크 로직 319_216_379회 수행yield() 사용 O: 체크 로직 000_730_447회 수행[코드 사용법]체크로직 while loop에 있는 Thread.yield();를 주석처리 on/off 하면서 체크하시면 됩니다.프로그램 수행 -> a, b, c, d, e, q를 순서대로 입력위 두 동작을 주석처리 on/off한 후에 실행하는 두 경우 모두에서 비슷한 속도로 해 주시면 비교가 더 명확합니다. [코드 설명]MyPrinterV4 코드를 기준으로 하여 다음과 같이 체크 로직의 수행 횟수를 카운트할 수 있도록 개선했습니다. 러프하게 작성한 코드라서 세부적인 부분은 무시바랍니다.// 체크 로직의 수행 횟수를 기록하는 변수 private static int count = 0;while (!Thread.interrupted()) { if (jobQueue.isEmpty()) { count++; // 체크 로직 수행시 1회 추가 기록 Thread.yield(); // 여기를 On/Off하며 체크 continue; } }// 메인 함수의 마지막 부분에 추가한 코드 // q를 입력하여 프로그램을 종료했을 때까지 수행된 체크 로직의 횟수를 출력 System.out.println(count);[전체 코드]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 { // 추가된 코드 private static int count = 0; 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); } // 추가된 코드 System.out.println(count); } static class Printer implements Runnable { Queue<String> jobQueue = new ConcurrentLinkedQueue<>(); @Override public void run() { while (!Thread.interrupted()) { if (jobQueue.isEmpty()) { // 코드 추가된 부분(시작) count++; Thread.yield(); // 주석 on/off 하며 비교 // 코드 추가된 부분(종료) continue; } try { String job = jobQueue.poll(); log("출력 시작: " + job + ", 대기 문서: " + jobQueue); Thread.sleep(3000); log("출력 완료: " + job); } catch (InterruptedException e) { log("인터럽트 발생. message=" + e.getMessage()); break; } } log("프린터 종료"); } public void addJob(String input) { jobQueue.offer(input); } } }
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
테스트에서 트랜잭션 어노테이션 질문 있습니다.
먼저 좋은 자료 감사합니다. 해당 예제대로 진행하면 전부 동작 잘하는데 비관적 락 테스트 할때 테스트에 @Transactional을 붙이면 동작이 지연되다 실패하는데 그러한 이유로 테스트 전후 처리를 해주시는 걸까요?테스트에서 @Transactional(롤백)을 사용안하시는 이유가 있을까요?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
run() 메서드가 종료되면 Thread-0을 회수하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]아래 사진과 같은 상황에서 Thread-0이 run() 메서드 수행을 완료하면, Thread-0은 할 일이 아무 것도 없는 상태입니다.그렇게 되면 Thread-0에게 할당해 준 스택 영역 전체를 JVM이(?) 회수하나요?아니면, 개발자가 따로 명시적으로 Thread-0의 회수?종료?를 명령할 때까지 이를 유지하나요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Join 실습 질문
public class JoinMainV3 { public static void main(String[] args) throws InterruptedException { log("Start"); SumTask task1 = new SumTask(1, 50); SumTask task2 = new SumTask(51, 100); Thread thread1 = new Thread(task1, "thread-1"); Thread thread2 = new Thread(task2, "thread-2"); thread1.start(); thread2.start(); // 스레드가 종료될 때 까지 대기 log("join() - main 스레드 대기 시작"); thread1.join(); thread2.join(); log("main 스레드 대기 완료"); log("task1.result = " + task1.result); log("task2.result = " + task2.result); int sumAll = task1.result + task2.result; log("task1 + task2 = "+ sumAll); log("End"); } static class SumTask implements Runnable { int startValue; int endValue; int result = 0; public SumTask(int startValue, int endValue) { this.startValue = startValue; this.endValue = endValue; } @Override public void run() { log("작업 시작"); sleep(2000); int sum = 0; for (int i = startValue; i <= endValue; i++) { sum += i; } result = sum; log("작업 완료 result = " + result); } } }안녕하세요.위 코드는 강의실습에 사용된 코드입니다.개인적으로 thread1.join(), thread2.join() 에 대해 main쓰레드가 WAITING 상태인지를 확인하고 싶어아래와 같이 코드 중간 중간에 상태를 체크해봤습니다. log("main 쓰레드 상태: " + Thread.currentThread().getState()); thread1.join(); log("main 쓰레드 상태: " + Thread.currentThread().getState()); thread2.join(); log("main 쓰레드 상태: " + Thread.currentThread().getState()); 결과는 모두 RUNNABLE로 나타나는데요.sleep시간을 늘려봐도 여전히 RUNNABLE상태가 나옵니다.코드의 어떤 부분을 수정해야지 WAITING상태를 확인할 수 있는지 궁금합니다~!
-
해결됨앨런 Swift Concurrency for Swift 6 (Part-1)
파트1 PDF 강의 자료 다운로드
파트1 PDF 강의 자료 다운로드 받고 싶은데, 어디서 받을 수 있는지 모르겠습니다.
-
해결됨실전! Django 활용
강의와 .md 차이
안녕하세요. 강의 잘 보고 있습니다.깃허브에 제공해주신 섹션 마크다운 파일과 영상과 다를 때가 존재하고, 마크다운 파일에 내용이 적혀져 있지 않을 때도 존재합니다. 여유가 된시다면 main 브랜치에 섹션 마크다운 파일들 내용을 모두 채워주시면 감사하겠습니다. ! 더 보기 좋을 것 같아요
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
우아한 종료 - 코드 질문이요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 궁금증 및 저의 생각이 맞는지 확인하려고 질문을 드립니다.우아한 종료 즉 영한님이 만든 ExecutorShutdownMain 클래스에서 shutdownNow를 하고 나면 코드 메시지에, 영한님 이 만들어 났던 sleep() 에서 런타임 메시지 및 인터럽트 발생을 확인할 수 있었습니다.근데 저가 sumbit()으로 하면 어떻게 될까 궁금해서 해보았는데.. 아래와 같이sleep() 메서드 안에 적은 '인터럽트 발생, sleep interrupted' 만 뜨지 런타입 예외가 발동하지 않을 것을, 확인을 할 수 있었습니다.그래서 생각해보니 submit() 메서드는 값을 future로 받아서 런타입 예외 발동하지 않는다? 런타입 예외는 실행 중에 받는 예외인데, 이미 future로 값을 받았기 때문이라는 생각이 듭니다.이것을 보고 이렇게 생각하였습니다.아니면 다른 이유가 있는 것인가요?저의 생각이 틀렷다면sumbit()으로 런러블이나 콜라볼로 값을 받았을 때 runtime 예외가 발생하지 않은 이유가 궁금합니다.답변 부탁드립니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
signal을 받은 스레드의 대기큐에서 우선순위
안녕하세요 영한님. 스레드의 대기 강의에서 질문이 있습니다. BoundedQueueV5를 사용하여 [소비자 먼저 실행] 때 질문입니다. 제가 이해한 것을 쭉 요약해볼테니 어디에서 틀렸는지, 왜 아닌지 답변을 부탁드립니다. ReentrantLock을 사용하게 되면 대기 큐와 producerCond, consumerCond가 있습니다. 소비자1,2,3은 현재 consumerCond에 있는 상황이고 이제 [생산자 시작]으로 넘어가게 됩니다. 생산자1이 락을 획득하였다고 가정하겠습니다. 그럼 생산자1이 락을 획득하여 생산을 시작하겠고, 생산자2와 3은 대기 큐에 등록되어 WAITING 상태로 락을 기다리고 있다고 생각했습니다. 생산자1이 생산을 하고 consumerCond.signal();을 호출하여 consumerCond에 있는 소비자1,2,3 중 하나를 깨웁니다. (소비자 1을 깨웠다고 가정)소비자1은 consumerCond에서 대기 큐로 이동하여 락을 받을 준비를 합니다. 생산자1이 종료되면서 락을 넘겨줍니다.이때 락을 받기 위해 대기중인 스레드가 소비자1, 생산자2, 생산자3이 있는데 왜 항상 소비자1이 우선적으로 락을 획득할까요? signal()을 통해 깨어난 스레드는 락을 우선적으로 획득할 수 있는 무언가가 주어지는건가요?? 답변을 기다리겠습니다. 감사합니다
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
생산자 소비자 대기 공간 분리 예제5 분석 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예.2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예.3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예.[질문 내용] 안녕하세요 영한님. 자바 고급편1 생산자 소비자 대기 공간 분리 - 예제5 분석 강의를 듣고 질문이 있어서 질문 올립니다. 소비자 먼저 시작 상황에서 질문이 있습니다.소비자 1,2,3이 대기상태에 들어가면서 consumerCond.await() 에서 대기를 하고 있습니다. 그 다음으로 생산자1이 락을 받고 실행이 되지요? 생산자가 생산을 하고 consumerCond에 signal을 주게 됩니다. consumerCond.await()에서 대기하고 있던 소비자를 깨우게 되겠죠. 그럼 대기하고 있던 소비자 중 하나가(소비자1)이 와서 락을 받고 소비를 한 뒤에 producerCond에 signal을 보냅니다. 여기서 제가 궁금한게 나옵니다. 대기상태에 있던 소비자1이 깨어나서 소비를 하고 producerCond에 signal을 줄때 producerCond에 대기중인 생산자가 하나도 없지 않습니까? 그럼 이때 생산자가 락을 받는다는 100%의 보장이 어떻게 이루어지는지 그게 궁금합니다. 질문을 요약해서 적겠습니다. 대기상태에서 깨어난 소비자가 producerCond에 signal을 보낼때 producerCond에 대기하고 있던 생산자가 하나도 없는데 어떻게 생산자가 그 락을 받는다는 100%의 보장을 할 수 있는지?대기상태에서 깨어난 소비자가 producerCond에 signal을 보낼때 producerCond에 대기하고 있던 생산자가 하나도 없는데 이럴때 소비자가 보낸 producerCond.signal(); 은 어떻게 처리가 되는지?감사합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
자바 병렬 처리
안녕하세요 영한님 ^^ 1기 인프콘때 뵈고, 오랜만에 강의를 보게되어서 반갑습니다 ㅎㅎ 다름이 아니라, 주문 체결 시스템을 개발하여서 병렬 처리 관련해서 공부 및 개발중인데 혹시 아래 링크책을 예전에 공부하신적 있으신가요? https://product.kyobobook.co.kr/detail/S000007668255아니면 다른 책 추천해주실만한게 있으실까요 ? ㅎㅎ아니면 이 강의 다보면 제가원하는 주문 체결 시스템을 만들기위한 기본 베이스는 이해가 될 수 있을까요?설날 잘보내시고 새해 복 많이받으세요 !
-
미해결앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해
오퍼레이션 큐 질문
오퍼레이션 큐는 기본적으로 1번 쓰레드에서 동기적으로 처리 된다고 하셨는데 이전 강의들을 보면 1번 쓰레드는 메인 쓰레드라고 언급하셨던 걸로 기억하는데요. 맞을까요?맞다면 메인쓰레드는 동기적으로 처리하면 안되는데 Operation을 오퍼레이션큐에 넣지 않고 사용한다면 잘못된 상용법인 인가요?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
ExecutorServic 우아한 종료 isTerminated()에 대해서 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 궁금증이 생겨서 질문을 올립니다.복습을 하던중에이쪽 부분에서 isTerminated() 부분을 호출하면 셧다운 상태를 확인할 수 있다고 해서, 당연히 true가 나올줄 알고 검증을 해보기 위해서 해보았습니다.근데 왠걸? 저와의 예상과는 다르게 false가 나옵니다..뭐가 문제 있는가 생각해봐서 여러 군데에 isTerminated()를 붙여놓고 해봤는데 true가 나옵니다.볼록 된 부분 입니다.근데 왜? 이렇게 되는지 아무리 생각해봐도 이유를 모르겠습니다.혹시 이렇게 되는 이유를 가르쳐 줄 수 있으신가요? 수정1submit로 뭐 좀 해보는게 있었는데 이것을 execute로 안바꾸고 실행해서 사진 수정함 + 인프런 ai가 답변해준 isShutDown()이 궁금해서 추가 된게 있음(이건 블락? 처리) 수정2사진1개 더 추가. 여러 번 돌려보니 에러메시지가 중간에 떠서 다시 올림. 모르겟다.. 답변 부탁 드립니다.
-
미해결운영체제 공룡책 강의
자바 serversocket 관련 질문입니다.
교수님 안녕하십니까, 강의를 수강하다 이해가 안 가는 부분이 있어 질문드립니다. 06. 프로세스간 통신의 실제: Chapter 3. Processes (Part 4) 강의 30:57 부분에서 출력 스트림으로 데이터가 나가고 있는 상황이어도 socket은 비어 있으니, 다른 클라이언트의 요청을 받을 수 있다고 하셨는데 주어진 코드로 이 과정이 가능한지 의문이 들어 질문 드립니다. 해당 코드에서 계속 출력 스트림을 열어놓으려면 client.close() 부분을 제거해야 될 것 같은데 이러면 기존의 client에 새로 요청 들어온 client가 덮어 씌어 지는 건가요..? 좋은 강의 감사드립니다.답변 기다리겠습니다:)