묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨김영한의 실전 자바 - 고급 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(); 등과 같이 코드를 통해서만 가능한가요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
DB락과 분산락
현재 프로젝트를 진행하며 재고 관리를 할 때 어떤 락을 사용하는 것이 좋을 지에 대한 고민을 하고 있습니다. 강의를 통해 락의 종류와 사용 방법에 대해 감을 잡을 수 있었습니다. 감사합니다!현재 동시성 문제가 발생할 때 어떤 상황에서 각각의 락을 사용하는 것이 좋을지에 대해 아직 잘 이해를 잘 하지 못해 판단이 어려운 부분이 있습니다. 분산락은 보통 어떤 상황에서 사용하나요?비관적락, 낙관적락을 적용하여 동시성 문제가 해결된다면, 굳이 분산락은 고려하지 않아도 괜찮을까요?아직 이해가 부족한 것 같아 질문드렸습니다!
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 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의 어떤 구현체든지 다 받아들일 수 있다.강의 잘 듣고 있습니다!
-
미해결성공적인 진짜 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 브랜치에 섹션 마크다운 파일들 내용을 모두 채워주시면 감사하겠습니다. ! 더 보기 좋을 것 같아요