묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
cpu 코어와 쓰레드 개수
설명에서 멀티코어 CPU 가 8개 있으면 한번에 16개 쓰레드를 실행할 수 있다고 말씀하시면서 설명을 진행해주셨는데요. 이전부터 궁금한게 있습니다. (제가 경험한 바로) 실무에서는 하나의 서버에 하나의 어플리케이션 (ex. 자바 웹 어플리케이션) 만 올려왔습니다. 이런 경우에는 위에서 말씀하신것처럼 웹 애플리케이션의 쓰레드들이 모든 cpu core 를 사용하게 될거라고 예상이 됩니다. 반면에 저희가 평소에 사용하는 환경 (ex. 윈도우) 에서는 하나의 유저 어플리케이션만 돌아가는게 아니라, 여러개의 유저 어플리케이션이 돌아갈텐데요. 예를 들어, intellij, chrome, 실습중인 자바 웹어플리케이션 등이 동시에 돌아가게 되면 각각의 유저 어플리케이션 내부에 존재하는 쓰레드들이 cpu 코어를 나눠쓰게 된다고 알고 있습니다. 이런 경우에는, 강좌에서 설명하신것처럼 cpu core 8개를 기준으로 최적화를 해도 사실상 제대로 최적화가 안될거 같은데 맞을까요 (= 다른 어플리케이션이 같이 돌아가니)? 그리고, cpu 코어를 사용하는 순서 (스케줄링) 는 os 에 의해서 정해지는걸로 알고 있는데요. 예를 들어, intellij (쓰레드 3개), chrome (쓰레드 5개), 웹서버 (쓰레드 50개) 라고 가정했을때 쓰레드가 많은 유저 어플리케이션이 cpu 의 사용횟수가 많을거라고 생각해도 될까요? 아니면, os 에서 유저 어플리케이션 3개에 공평하게 30% 씩 사용시간을 분배하고 이 30%의 시간을 내부에 있는 쓰레드들이 나눠쓰게 되는걸까요? 강사님 설명이 너무 좋아서 여러 방면에서 생각하다보니 질문이 많아졌습니다. 답변 미리 감사합니다 🙂
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
runnable 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]섹션 3에서 runnable를 인터페이스로 불러서 사용할 때 static으로 정의하는 이유가 있나요? 그리고 간간히 왜 이거는 생성자를 받아오지 않고 바로 써야 하는지, 이건 왜 static을 써야 하는지 등등의 의문이 드는데 제가 자바에 대한 이해가 부족해서 그런 걸까요? ㅜㅜ 중급편 내용이 아는 내용이라 건너뛰었는데 중급도 수강하는게 맞을까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
자바가 아닌 다른 언어에서도
동작원리자체는 동일할까요?닷넷에서 테스트코드 작성해도 동일할지 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
메모리 가시성 문제가 발생하는 이유
멀티스레드 환경에서 메모리 가시성 문제가 발생하는 이유를, CPU 캐시와 메인 메모리 간의 데이터 갱신 시점 차이 때문이라고 이해했습니다.그렇다면 이 현상은 하드웨어 수준의 문제로 봐야 할까요, 아니면 JVM의 메모리 관리 방식이 영향을 주는 걸까요?또한, 이런 문제가 자바가 컴파일 언어이기 때문에 발생하는지도 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
데몬스레드가 어떨 때 사용이 되는지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]데몬스레드의 특징은 이해했는데, 어떨 때 사용이 되는 건지 궁금합니다. 그리고 현업에서도 보통 데몬 스레드를 사용할 일이 있나요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Future.cancel() 취소를 사용하는 예가 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요! 강의 잘 듣고 있는와중에 Future 관련 내용을 보다가 궁금한 점이 생겨서 질문 남깁니다. cancel() 기능이 필요한 실제 사례가 어떤 것이 있을까요?Future.cancel() 을 통해 실행을 취소시킬 수도 있다는 것은 이해가 됐습니다. 그런데 cancel() 기능이 필요한 실제 사례가 뭐가 있을지가 연상이 잘 안됩니다.실제로 작업을 수행하다가 취소 처리를 해야하는 경우가 일단 뭐가 있을지 궁금합니다.그냥 생각이 드는 건 특정 시간 제한이 지나서인데, 이건 get에 시간제한을 둬서 TimeoutException 하는 걸로 충분할 것 같아서요. cancel(false) 로 취소는 하되 과정은 수행하도록 내버려두는 케이스는 어떤 경우를 위해 있는건가요?아예 interrupt로 취소를 시키는 경우는 막상 예시가 떠오르진 않지만 논리적으로 이해가 갑니다. 어떤 작업을 수행하다가 특정 케이스에서는 필요가 없어져서 취소시킬 수 있겠다 싶습니다. 그런데 cancel(false) 로 취소는 하되 그 과정을 수행하도록 내버려둘 필요가 있나 싶어서요.어차피 cancel을 하면 true/false 어떤걸 넘겨줘도 get 하면 exception이 발생하면서 결과값을 못 얻는데 수행을 하게 내버려 둘 필요가 없을 것 같은데 어떤 경우를 위해 이렇게 구현이 되어 있는 건지 궁금합니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
멀티스레드 단일스레드
멀티스레드와 단일스레드 구조를 선택할 때 어떤 기준으로 결정하나요? 단순히 성능만이 아니라, 트레이드오프 측면에서 고려할 부분도 있을 것 같아 질문드립니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
JVM 메모리와 CPU 1,2차 캐시
어떤 강사님께서는 volatile 을 설명하실때 'JVM 의 메인메모리 와 작업메모리' 로 설명해주시지 않고 CPU 와 1, 2차 캐시 사이에 동기화를 하는데 쓰여진다고 설명을 하셨는데요. 널널한 개발자님께서 설명한 부분이 더 정확하다고 생각이 듭니다. 제가 궁금한건 말씀하신 내용처럼 JVM '메인메모리' 와 '작업 메모리' 사이에서 동기화가 필요할때 여러 문법들을 사용한다면, java 를 사용할때 CPU 와 1,2 차 캐시 사이의 동기화에 대해서는 신경쓸 필요 없다고 이해해도 될까요? 이 부분을 JVM 이 알아서 처리한다고 이해하는게 맞을까요?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
synchronized 와 인스턴스의 lock
[질문 내용]이 부분을 보면 synchronized 메서드를 호출하려면 인스턴스의 lock이 필요하다고 되어잇는데, 헷갈리는 부분이 있습니다인스턴스는 메서드 단위가 아닌, 클래스 단위로 존재하는거라고 알고 있는데, 그러면 지금 synchronized 된 메서드 하나를 호출하면 해당 클래스 전체에 Lock 이 발생한다(다른 스레드는 접근하지 못한다)는 개념으로 이해가 되는데 이렇게 동작하는게 맞는건지 궁금합니다
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
synchronized 키워드만으로 메모리 가시성이 해결되는 이유가 궁급합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]synchronized 키워드를 사용하면 내부적으로 캐시 메모리에 있는 데이터를 메인 메모리에 값을 동기화 시켜주는 걸까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
[스레드 풀과 Executor 프레임워크1][문제와 풀이] `log("일부 작업이 실패했습니다.");` 실행되는 경우가 있을까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.문제와 풀이 정답 코드에서if (inventoryResult && shippingResult && accountingResult) { log("모든 주문 처리가 성공적으로 완료되었습니다."); } else { log("일부 작업이 실패했습니다."); }else 블록이 실행되는 케이스가 있을까요?future.get() 했을 때의 결과가 모두 true가 나오거나 예외가 터져서 else 블럭은 실행되지 못하는 것으로 이해했습니다. 이렇게 이해한 것이 맞을까요?예제를 간결하게 하기 위해 예외 처리는 제외하셨다고 적어주셨는데 혹시 이와 관련된 부분일까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
원자적 연산이 멀티스레드 상황에서 안전한 이유를 제대로 이해했는지 확인 부탁드립니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요!강의 교안에 따르면 원자적 연산은 '멀티스레드 상황에서 다른 스레드의 간섭 없이 안전하게 처리되는 연산이라는 뜻이다' 라고 하는데요그렇다면 동일 객체에 대한 원자적 연산들이 여러 CPU 코어에 나뉘어 동시에 실행하려고 해도 동시에 수행할 수 없기 때문에 원자적 연산은 멀티스레드 환경에서 안전하다고 이해해도 될까요?그렇게 해야 멀티 스레드 상황에서 원자적 연산들이 다른 스레드의 간섭없이 처리될 수 있을 것 같아서요.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
자바 고급 1,2,3편 같이 진행해도 문제없나요
[질문 내용]고급 1편을 들으면서 2편과 3편을 동시에 같이 들어도 되나요?고급 2편이나 3편에서 앞서 배운 부분을 활용하거나 하는 부분이 있을까요? 람다나 어노테이션 같은 개념을 빨리 보고 싶은데 강의 순서와 독립적으로 들어도 이해에 문제 없을지 궁금해서 질문합니다
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
CPU 캐시 때문에도 잔액이 200원이 될 수 있나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.t1 t2 가 동시에 실행되지 않고, 약간의 시간차가 있는 상태에서두 스레드가 CPU 캐시를 통해 balance를 읽어들이고 쓰면 잔액이 200원이 될 수 있을까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
synchronized 메서드와 join 관련 질문이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.만약 무한정 대기할 수도 있는 상황에서 t1.join(50);t2.join(50); main의 코드를 이렇게 바꿔봤는데 결과가 똑같더라구요 이게 왜 그런지 알고 싶습니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
섹션 14. 115번 강의 내용 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하십니까 선생님, 115번 강의 내용 중 질문이 있습니다.각각 작업의 크기를 1100, 1200, 1201번 경우로 나눠서 테스트를 하였는데 작업 처리 속도가 더 빨라서 max 스레드 개수까지 안 늘어날 수도 있지 않을까 하는 생각이 들었습니다. 즉, 작업 처리 속도가 빨라서 큐에 적재되는 작업이 줄어들어 큐에 담긴 작업이 1000개 되지 않아 스레드 긴급 투입이 발생하지 않을 수도 있지 않은가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
교안에 있는 7페이지 데이터 영역
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]교안에 있는 7페이지에 운영체제와 프로세스, 스레드 그림에서 공유되는 부분에 코드, 힙, 기타가 있는데 데이터 영역도 공유되는게 맞는지 궁금해서 질문드립니다. 감사합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Executor 스레드 풀 관리 질문
[질문 내용]여기에 질문 내용을 남겨주세요.궁금한 것이 생겨서 질문 남깁니다.Executor 스레드 풀 관리에서 예제와 같은 상황일 때, 만약 요청이 계속 들어온다면 초과 스레드를 유지하는 것이 좋다고 말씀하셨습니다. 거기서 의문이 생긴 게, 요청이 계속 들어오면 동적으로 maximumPoolSize를 조절할 수 있는 방법이 있나요?아니면 초과 스레드를 살려두는 TimeUnit 값을 늘릴 수 있는 방법이 있나요?유연하게 관리할 수 있지 않나 싶어서 찾아보니, setMaximumPoolSize(int maximumPoolSize)setKeepAliveTime(long time, TimeUnit unit)으로 설정할 수 있더군요. 이를 활용해 동적으로 관리하는 것인지 궁금합니다!실무에서는 어떤 방식을 사용하는지 궁금해 질문 남깁니다.감사합니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
문제와 풀이 질문!
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]package thread.executor.test; import java.util.List; import java.util.concurrent.*; import static util.MyLogger.log; import static util.ThreadUtils.sleep; public class NewOrderService { private final ExecutorService es = Executors.newFixedThreadPool(10); public void order(String orderNo) throws InterruptedException, ExecutionException { InventoryWork inventoryWork = new InventoryWork(orderNo); ShippingWork shippingWork = new ShippingWork(orderNo); AccountingWork accountingWork = new AccountingWork(orderNo); try { List<Callable<Boolean>> tasks = List.of(inventoryWork, shippingWork, accountingWork); List<Future<Boolean>> futures = es.invokeAll(tasks); for (Future<Boolean> future : futures){ Boolean value = future.get(); if (!value){ log("일부 작업이 실패했습니다."); } } log("모든 주문 처리가 성공적으로 완료되었습니다."); } finally { es.close(); } } } 코드의 내용을 이렇게 짰는데요.디자인 패턴 중 전략 패턴을 적용하고 싶은데 영 떠오르지 않네요.InventoryWork, ShippingWork, AccountingWork 처럼 계속 인스턴스가 늘어나면, 코드가 번잡해질 듯한데 전략 패턴을 어떻게 녹일 수 있을까요?떠오르지 않아서 질문드립니다.감사합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
영한님께 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 영한님, 항상 좋은 강의 덕분에 편하게 공부하고 있습니다.다름이 아니라 제가 공부 내용을 노션에 정리하는데 혹시 영한님께서 만드신 다양한 그림을 사용해도 되는지 여쭈려고 글 남깁니다.후에 이 내용을 부트캠프(우테코) 지원 시 공부 자료로 활용할 계획이라서 외부로 노출이 되는데, 그 때 영한님이 만드신 그림이 노출이 돼도 될까요..?된다면 출처는 당연히 남기겠지만, 안된다면 사용하지 않겠습니다!항상 감사드립니다:)