묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 고급 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로 강의와 다르게 순서가 항상 일정하게 출력되는데 혹시 무엇이 문제인지 알 수 있을까요 ?
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
몇가지 질문드립니다
lock flag로 스레드가 인스턴스에 접근한다고 하셨습니다. 그런데 멀티스레드에서는 동시에 인스턴스에 접근하여 각각 코어에서 연산을 하기 때문에 동기화 문제가 발생합니다. 그럼 항상 lock flag을 획득하고 접근하는게 아닌가요? 그리고 스레드가 함수 단위라 하셨는데, write 과정을 cpu 스케줄링 관점에서 생각하면Time slice 내에서 load, read 하고 기다린 뒤 다시 자신의 차례가 왔을 때 memory에 write한다고 이해했는데 맞나요? 또한 synchronized를 이용하면 원자성이 보장된다고 하셨습니다. 그렇다면 복잡한 로직과 관계 없이 synchronized를 붙이면 스케줄링 없이 한방에 실행되는 건가요? 마지막으로.. 서버를 겉햝기식으로 공부하다가 회의감이 들어 널널한 개발자님 강의를 들으며 jvm, 자바부터 다시 공부하고 있습니다. 하지만 공부를 하면서 불안하고 회의감이 듭니다. 왜 이런 감정이 드나 생각해보았더니 jvm, 멀티스레드를 프로젝트에 어떻게 녹여서 포트폴리오화 해야 할지 모르는 막막함 때문이었습니다. 제 생각에 조언, 지적을 해주실 수 있나요?
-
미해결김영한의 실전 자바 - 고급 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되는게 아니라면 왜 레이스 컨디션 문제가 발생하는지 궁금합니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
new Condition 부분 질문
선생님 안녕하세요. 이해가 안되는 부분이 있습니다.대기 메서드가 호출되면 락이 해제되고,=> 대기 메서드가 호출 되면 락이 해제되는 것까지는 이해했습니다.신호 메서드(notify)가 호출되어 대기 메서드에서 반환하기 전에 스레드는 락을 다시 획득한다.=> 이부분이 잘 이해되지 않는데요. 대기 메서드가 호출되면서 락이 해제, 와 동시에 신호 메서드가 호출되어 대기가 다 끝나기전에 (wait) 락을 다시 획득한다는 말인가요? 즉, public wait () { 1. 락 해제 2. 신호 메서드 호출 (notify all) 3. Thread.currentThread -> 락 획득??}답변 부탁드립니다!감사합니다.
-
미해결김영한의 실전 자바 - 고급 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상태로 기다리는걸로 알고있는데 혹시 잘못된 강의설명인지 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
강의에서 말씀하신게 어느 강의에 있는지 궁금합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스레드 풀 로그 관련 얘기하셨는데스프링 강의에서 엑츄에이터.그라파나 얘기를 한적 있다고 하는데 어느 강의에서 어느 부분인가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
멀티 코어에서의 CAS
안녕하세요 강사님 🙂 너무너무 잘 듣고 있습니다.좀 바보같은 질문일 수도 있는데, CPU 가 하드웨어적으로 다른 스레드의 접근을 막고 한 연산 안에서 "값 확인, 값 변경" 을 진행한다고 이해했습니다. 혹시 멀티코어에서 더라도 별다른 문제가 발생하진 않나요?가령 두 하드웨어가 연산을 따로따로 하며 서로를 인식하고 있지 않으니까, 동시에 "한 연산"을 수행해서, "값 확인 및 변경" 역시 정확히 동시에 진행된다면 충돌이 나지 않을까? 싶은 생각이 들었습니다. 제가 잘 못찾은건지 질문이 말도 안되는건진 모르겠지만 찾아봐도 잘 나오질 않아서, 질문을 드려보게 되었습니다 ㅠ
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
13:00 강의 내용 이해 질문
즉, 메인스레드가 하나의 스레드가 아닌 여러개 스레드 각 스레드마다 조인을 걸 수 있겠죠. 조인을 겁니다. 각스레드의 작업이 끝나게될때까지 메인 스레드는 계속 대기하게되겠죠 각 스레드가 작업이 종료되면 그 때 메인 스레드는 대기에서 빠져나오지만 나머지 스레드가 다시 모든 작업이 종료될 때 까지는 대기해야되겠죠?라고 하시면서 실행을 재개하는 흐름을 반복한다. 라는 4번 내용을 읽었습니다. 즉, 저 설명 내용이 각 스레드가 join 이 걸려서 join 이 걸린 스레드들이 작업이 종료되면 그 때 메인스레드는 대기 즉, wait 상태에서 나오고 runnable 상태가 되는거라고 이해했습니다.그런데 다음 설명에서스레드는 대기에서 빠져나오지만 나머지 스레드가 다시 모든 작업이 종료될 때 까지는 대기해야되겠죠? 라는 설명이 이해가 잘 안가는데요각 스레드가 종료됨에따라 메인스레드가 대기에서 빠져 runnable 상태가 되지만... 나머지 스레가 다시 모든 작업이 종료될때까지 대기????? ...이미 메인을 제외한 모든 스레드들이 작업이 끝났는데 어떻게 또 종료될때까지 대기하는거죠? 이전 강의에서 한번 사용한 스레드는 재사용이 불가능하다고 하셨습니다
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
키워드 synchronized와 어노테이션 synchronized
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의에서는 키워드 synchronized를 메서드 앞부분에 붙여 동기화를 구현하는데, 롬복의 @Synchronized 다른 점이 무엇인지 궁금합니다. 그리고 실무에서는 둘 중 어느 방법을 사용하는지도 궁금합니다!
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
synchronized vs ReentrantLock vs Atomic 너무 혼란스럽습니다..
synchronized, ReentrantLock, Atomic 모두 상호배제(동기화)를 구현하지만, 락을 "획득하고 해제하는 과정" 자체도 동시 접근이 발생할 수 있는 또 다른 임계영역처럼 보입니다.→ 그렇다면 이 락 자체 또한 어떻게 동기화하는지 궁금합니다.핵심적으로,synchronizedJVM이 모니터 락을 통해 상호배제를 구현하는데 내부적으로CAS 연산 + OS의 스레드 대기 관련 시스템 콜 + JVM 내부 스레드 대기 큐 을 활용 상호배제를 구현한다.즉, 락 획득과 해제 과정의 동기화는 JVM 수준에서 구현한 것이다. OS는 단지 스레드를 잠재우고 깨우는 역할만 담당→ 이 이해가 맞는지?ReentrantLock자바에서 명시적으로CAS 연산 + OS의 스레드 대기 관련 시스템 콜 + 스레드 대기 큐을 활용하여 상호배제를 구현한다.즉, 락 획득과 해제 과정의 동기화는 자바 코드 수준에서 직접 구현한 것이다. OS는 단지 스레드를 잠재우고 깨우는 역할만 담당→ 이 이해가 맞는지?Atomic자바에서 명시적으로CAS 연산 활용하여 상호배제를 구현한다.즉, 락이 없고, 시스템콜도 없다. CAS 한 줄이 동기화의 전부→ 이 이해가 맞는지?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
우아한 종료 방식은 왜 라이브러리에 공식적으로 추가하지 않았을까요? ㅎㅎ
학습적으로 필요한 질문은 아니긴 하지만.. 100% 궁금해서 질문 드리는데요! 필요한 대부분의 기능을 미리 만들어서 제공하는 라이브러리에서학습 중 직접 작성한 shutdownAndAwaitTermination 메서드 같은건 왜 공식적으로 만들어 제공하지 않은걸까요?좀 충격? 적인건 라이브러리에 구현방법을 주석까지 남겨가며 제안했다는 건데요... 저걸 왜 그냥 메서드로 만들어두지않고 제안만 한걸까요?구조적인 문제가 생기는걸까요?너무 궁금하네요...ㅋㅋ
-
해결됨MFC Windows 프로그래밍 - 응용
윈도우 개발 튜토리얼
선생님 안녕하세요강의를 잘 듣고 있는데, 궁금한 점이 웹개발 같은 경우는 홈페이지 하나를 처음부터 만드는 과정을 쭉 보여주는 그런 강의가 꽤 있는데윈도우 응용 프로그램 개발에 있어서는 이런 거 찾기가 좀 힘든 거 같아요예를 들면, MFC를 사용해서 엑셀이라든지, 카카오톡을 만든다는지 뭐 이런 처음부터 보며 따라할 수 있는 과정이 있으면 좋겠는데, 이런 걸 찾기가 힘든 것 같아요(제 능력이 모잘라서 잘 못 찾을 수도 있습니다.)물론 배운 스킬을 잘 응용해서 만들 수도 있는 분들도 계시겠지만, 학습적으로도 따라 만들면 결과가 보이니 재미도 있고 쉽게 배울 수 있다는 생각이 들어서요. 혹시 선생님께서 이런 강의나 책 같은 자료(밑바닥부터 GUI 응용프로그램을 개발)를 혹시 아는 게 있으시면 추천해주시면 감사하겠습니다.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
멀티스레드의 예외 처리
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.위 예제에서 main() 메서드가 InterruptedException을 던져버렸는데, 프로그램이 오류 로그를 띄우지 않고 정상 결과를 출력합니다. 왜 프로그램이 다운되지 않는지 궁금합니다. 원래 main() 메서드 밖으로 오류가 나가면 프로그램이 다운되니 무조건 main() 메서드 선에서 모든 오류를 처리해야 하는 것 아니었나요? 이 runnable을 상속 받을 스레드는 run() 메서드로 런타임 오류를 생성해 밖으로 던져버립니다. 그럼 그 스레드를 호출한 외부 스레드인 main() 스레드로 런타임 오류가 전달되어야 하는 것 아닌가요? 만약 main() 스레드로 가지 않는다면 한 스레드에서 던진 오류는 대체 어디로 가나요? 어디에서 무엇이 그 오류를 처리하는 건가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
데몬스레드 파트 첫 번째 예제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 정적 중첩 클래스에서 스레드를 정의한 후 main() 메서드에서 해당 스레드를 생성한 후 종료하는 예제입니다. 그런데 이 스레드의 run() 메서드를 보면 catch에서 런타임 오류를 생성한 후에 던집니다. 1. 발생한 오류는 체크 오류인데 굳이 런타임 오류를 새로 생성해서 던진 까닭은 단순히 InterruptedException 발생을 강조해서 알리기 위함인가요? (오류 로그를 남기듯이 오류 발생 흔적 남기기?) 2. run() 메서드에서 런타임 오류를 생성해서 던졌고 main() 메서드에는 이에 대한 별도의 오류 처리 과정이 없습니다. 그런데 왜 메인 메서드가 터지지 않고 정상 결과를 출력할 수 있는 건가요? 오류 처리 코드가 없으면 런타임 오류는 자동 던지기 처리돼서 메인 메서드 밖으로 오류 나가버리고 프로그램 다운돼야 하는 상황 아닌가요...?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
인터럽트, 체크 예외 catch 재질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.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();가 호출이 안 된다고 합니다ㅠ