묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
모니터와 synchronized, ReentrantLock, 원자적연산 CAS관련해서 추가적으로 더 깊게 공부했는데 제가 이해한 것이 맞나요??
운영체제 관점의 실제 모니터 명세는 조건변수를 추가할 수 있습니다.synchronized는 자바가 구현한 모니터인데 조건변수의 추가가 불가능해서 생산자 소비자 문제를 해결할 수 없습니다.ReentrantLock은 자체적으로 구현한 락을 사용하지만 그 락의 구현은 실제 조건변수를 추가할 수 있는 모니터의 명세를 따르고 있어 모니터를 구현했다고 할 수 있습니다.모니터는 CAS를 내부적으로 사용합니다. CAS를 반복문으로 돌리며 바쁜대기를 하거나 Park로 락을 획득하고 반환합니다.원자적 연산도 CAS를 구현하지만 단순 속도가 synchronized와 ReentrantLock보다 더 빠른 이유는 락의 존재 유무입니다. 혹시 제가 이해한 내용들이 맞을까요?? 현재 81강까지 들었습니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Future cancel기능을 사용했지만 interrupt가 발생하지 않을 때 어떻게 처리해야하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요.Future의 cancel기능에 대해 실험하면서 해결하기 어려운 부분을 만나 질문드립니다.📋실험 내용Callable의 call메서드 내부에서 I/O와 같은 블로킹 작업 진행(or Interrupt가 되지 않는 작업)Future의 cancel 진행스레드 호출 대상은 CancellationException 예외 발생 후 진행※ 스레드 풀의 스레드는 계속 실행 중임을 확인 💥문제 사항이런 방식으로 로직이 지속 실행되면 스레드 풀의 스레드는 종료되지 않으면서 고갈되어 가고 결국엔 작업이 쌓이다가 에러를 뱉어내고 오작동 하게 될 것이라 추측됩니다. ❓질문 내용Q. cancel기능은 Interrupt 를 발생해주면서 작업을 중단합니다. 만약 I/O 작업 처럼 Interrupt가 먹히지 않는 로직에서는 어떻게 스레드의 실행을 종료하고 스레드 풀로 반납할 수 있을까요?💻 코드public class FutureCancelMain { private static boolean mayInterrupIfRunning = true; public static void main(String[] args) { ExecutorService es = Executors.newFixedThreadPool(1); Future<String> future = es.submit(new MyTask()); log("Future.state: " + future.state()); sleep(3000); log("future.cancel(" + mayInterrupIfRunning + ") 호출"); boolean cancelResult = future.cancel(mayInterrupIfRunning); log("cancel(" + mayInterrupIfRunning + ") result: " + cancelResult); try { log("Future result: " + future.get()); } catch (CancellationException e) { log("Future는 이미 취소되었습니다."); } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } es.close(); } static class MyTask implements Callable<String> { @Override public String call(){ boolean flag = true; // Scanner scanner = new Scanner(System.in); while(flag) { log("무한 작업 중..."); } return "Completed"; } }
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
2.스레드 생성과 실행 - 17P 그림 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 강의 잘 수강하고 있습니다. 17P에 시간의 흐름으로 분석 이라는 그림이 있습니다.그런데, 마치 스레드 생성 이후에, start()를 통해 실행을 하는 것 처럼 그림이 그려져 있습니다. 'start() 호출 전 3. 호출 후' 라는 프린트가 중간에 끼어있으니 더 그런것 같은데. 제가 알기로 start() 명령어와 동시에 실제 스택이 생성되고 실행되는 것으로 알고 있습니다. 그렇다면 '1 start() 호출 전' 이 main 박스 맨 위로 가고, 스레드 생성이 호출 뒤로 가야 하는거 아닌가 싶습니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
자바 동시성 현업에서 사용예시가 궁금합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예3. 질문 잘하기 메뉴얼을 읽어보셨나요?예[질문 내용]안녕하새요 강사님 수업내용이 너무 알차서 정말 잘 듣고 있습니다 근데 하나 궁금한 점이 생겨서요!요즘 백엔드는 서버가 여러대인 환경이라 각 서버의 메모리가 공유되지 않아서 자바에서 서로 락을 걸어도 서로의 RAM이 다르기때문에 재고쪽 문제에서 생기는 좋아요 수라던가 재고 같은 문제는 자바 쪽 락보다는 DB의 낙관적락 또는 비관적 락으로 막아주는경우가 많다고 보게 되었는데 또 다른 예시로는 버튼을 따닥 해서 여러 요청이 들어오는 경우도 자바 스레드 제어보다는 DB에서 유니크 키로 막을수 있다고 생각이 드는데 그렇다면 현업에서 ConcurrentHashMap이나 Atomic, synchronized 같은 자바 동시성 기술은 구체적으로 어떤 상황에서 필수적으로 사용되나요?DB 부하를 줄이기 위래 또는 성능 최적화를 위해 멀티스레드를 어떻게 활용하는지도 궁금합니다 !
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
ReentrantLock 동작 원리에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]ReentrantLock에 대한 순서 보장에 대해 궁금증이 생겨 질문을 남깁니다.producerCond에서 대기하고 있던 스레드가 producerCond.signal() 호출로 깨어났을 때 ReentrantLock의 lock을 얻기 위한 대기 큐로 들어가는 것으로 알고 있습니다.근데 이때 signal() 호출로 깨어난 A 스레드가 lock 대기 큐로 들어갔는데 앞에 이미 스레드 B가 있어서 B가 ReentrantLock의 lock을 얻어버렸다고 가정했을 때 A는 다시 producerCond.await() 호출로 producerCond 스레드 대기 큐에 들어가면 맨 뒤로 이동할 것 같습니다. 근데 저는 B는 await()에 넣고 A를 실행하는 순서로 순서를 보장하고 싶은데 이것도 더 세밀하게 구현을 할 수 있는 것일까요?? 제가 질문에 대한 설명을 잘 못해서.. 혹시 이해가 되신다면.. 답변해주신다면 감사하겠습니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
synchronized 대신 join 을 사용하여 순서를 보장할 경우 해법이 아닌가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]synchronized 이전 강의에서 join 을 활용하여 순서를 쓰레드의 순서를 보장하여 실행하는 방법에 대해 배웠습니다. 만약 동시에 같은 값에 대해 접근하는 것이 문제 라고 가정 할 경우 join 을 활용하여 특정 쓰레의 종료 이전 까지 다음 쓰레드 를 시작하는 것을 막는 다면 해결할수 있는 문제가 아닌가 생각합니다.예를들어 다음과 같이 t1.join() 을 사용하면 t1 의 쓰레드가 종료 이전 까지는 t2 는 대기 상태가 될 것이고 t1 에서 최종 결과가 나오기 전까지는 t2 는 실행하지 못할 것 입니다.public class BankMain { public static void main(String[] args) throws InterruptedException { //BankAccount account = new BankAccountV1(1000); BankAccount account = new BankAccountV1(1000); Thread t1 = new Thread(new WithdrawTask(account, 800), "t1"); Thread t2 = new Thread(new WithdrawTask(account, 800), "t2"); t1.start(); t1.join(); sleep(500); log("t1 state :"+t1.getState()); log("t2 state :"+t2.getState()); t2.start(); //t2.join(); log("최종 잔액 : "+account.getBalance()); } }
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
메모리 가시성 문제 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]메모리 가시성 문제 가 발생하는 이유는 쓰레드가 공유 된 runFlag 값에 대해 반영이 않되어서 발생하는 문제라고 설명을 해주셨습니다. 예를들어 main 쓰레드에서는 false 를 true 로 변경하였으나 work 쓰레드에서는 해당 값이 변경되었는지 모르기 때문에 계속 동작하는 상태 입니다. 여기서 이해가 않가는 부분이 모든 프로그램은 보조기억 장치에서 실행을 하고 실행에 필요한 변수가 값 들은 모두 ram 과 같은 주 기억 장치에 저장되고 사용되는 걸로 알고 있습니다. 그렇다면 이 과정에서 쓰레드는 캐시메모리가 아닌 주기억 장치에서 값을 읽어서 사용해야 합니다. 지금 과정으로 설명된 것을 이해 하면 주기억 장치 또한 단순히 값을 저장하는 것 뿐이고 실제로는 캐시 메모리에서 한번더 데이터를 저장하고 cpu 는 캐시메모리에 접근하여 데이터를 연산한다고 이해 했습니다. 맞을까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Future4-이유 질문
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요.Future를 거치는 SumTaskMainV2에서 future2.get()이 future1.get() 실행 후 task1의 call() 완료를 기다리지 않고 바로 실행되는 것을 콘솔 로그로 확인 가능했는데요.그렇다면 Future를 거치지 않고 결과를 반환한다 가정할 때, task2가 task1 완료를 기다린 후 수행된다고 나와있는데, "Future는 한 스레드 작업의 future1.get() 실행 후, 다른 스레드의 작업 future2.get()은 future1의 call() 완료까지 기다리지 않는 기능이 있다"이렇게 이해해도 될까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
오타 제보
4번 스레드 제어와 생명 주기2 PDF의 24페이지 "그리고 스캐줄링 큐 ..." -> "그리고 스케줄링 큐 ..." 7번 고급동기화 PDF의 1페이지 "LockSupport의 대표적인 기능은 가능과 같다" -> "LockSupport의 대표적인 기능은 다음과 같다"
-
미해결김영한의 실전 자바 - 고급 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이 발생하면서 결과값을 못 얻는데 수행을 하게 내버려 둘 필요가 없을 것 같은데 어떤 경우를 위해 이렇게 구현이 되어 있는 건지 궁금합니다.
-
해결됨김영한의 실전 자바 - 고급 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원이 될 수 있을까요?