inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

Yield 를 사용한 후 currentThread

해결됨

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? ( 예 /아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ( 예 /아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 /아니오) [질문 내용] 안녕하세요. public void run() { while (!Thread.interrupted()) { if (jobQueue.isEmpty()) { Thread.yield(); continue; } ... } 위에 코드에서 Yield 를 사용하면 그 쓰레드가 양보를 해서 다시 스케쥴러로 들어간다고 하셨는데, 그러면 Thread.yield(); 가 실행이 된 후에, 다시 CPU 가 이 쓰레드를 실행시키기 전까지 그 다음 줄의 continue 코드는 실행되지 않고 멈춰있는 상태라고 생각하면 될까요? 그렇다면 쓰레드는 CPU 가 다시 실행시킬 시점에 몇번째 라인까지 실행을 했는지 기억하고 있다가 CPU 에게 알려주는 건가요? 감사합니다.

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
코끼리 댓글 1 좋아요 2 조회수 225

강의 이미지에 대해 질문 있습니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

그림에서 main 스레드 안에 CPU 코어 1이 있는데 이 상황을 CPU 코어 1에 main 스레드가 할당 됐고 CPU 코어 1은 main 스레드의 스택 영역과 main 스레드가 속해 있는 프로세스의 코드, 데이터, 힙 영역에 접근해서 값을 가져다가 연산한다 라고 이해를 하면 될까요? CPU 내부에 존재하는 레지스터와 위 이미지의 캐시 메모리는 역할이 다르다고 보면 될까요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
감바스 댓글 1 좋아요 0 조회수 206

자바 스레드와 커널 스레드에 대해 질문 있습니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

기존 Java의 스레드 모델은 Native Thread로, Java의 유저 스레드를 만들면 Java Native Interface(JNI)를 통해 커널 영역을 호출하여 OS가 커널 스레드를 생성하고 매핑하여 작업을 수행하는 형태로 알고 있습니다. 앞서 얘기 해주신 Thread를 상속해서 만든 스레드와 Runnalbe을 사용해서 만든 스레드가 Java의 유저 스레드인지 궁금합니다. Thread thread1 = new Thread(runnable) 이런식으로 스레드를 생성 했을때 메모리의 힙 영역에 thread1이 저장되고 thread1을 위한 스택 영역이 생성된다고 보면 될까요? OS가 생성한 커널 스레드는 메모리 어디에 저장 되는지 궁금합니다. JVM은 JNI라는 기술을 사용해 자바의 유저 스레드와 커널 스레드를 매핑 해주는 작업만 해주고 이후에 스레드 관리는 OS가 하는건지 궁금합니다. 스레드를 생성할때마다 해당 스레드를 위한 스택 영역이 생성된다고 하셨는데 이때 커널 스레드를 위한 스택도 만들어지는 건지 아니면 커널 스레드가 유저 스레드의 스택 영역을 가져다 쓰는건지 궁금합니다.

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
감바스 댓글 1 좋아요 1 조회수 289

스레드 라이브러리는 커널과 같은 역할을 하지 못하나요?

미해결

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

강의와 다른 질의응답을 확인하였을 때, 사용자 수준에서 사용자 레벨 스레드 생성을 스레드 라이브러리가 관리하고, 관리의 범위는 스레드의 생성 및 소멸, 스케쥴링, 컨텍스트 스위칭을 할 수 있다고 말씀해주셨습니다! 그런데 다대일 스레드 매핑 모델의 특징에서 한 프로세스에 속해있는 사용자 수준 스레드들 중 하나가 block되면 프로세스 전체가 block이 되는데, 이는 커널에서 프로세스가 가지고 있는 개별적인 스레드를 인지하지 못하고, 그냥 하나의 스레드로 인지해서 대체할 스레드를 찾지 못함이라고 질의응답에서 확인 하였는데요, 강의 내용대로 스레드 라이브러리가 사용자 스레드를 관리하기 위해 많은 작업을 하고 있는데, 사용자 스레드 라이브러리에서 사용자 수준 스레드 중 일부가 블락되었을 때 커널 대신 다른 대기 중인 스레드를 ready > run 상태로 변경할 수는 없는 건가요?

  • java
  • 동시성
  • multithread
  • synchronisation
hylim 댓글 1 좋아요 0 조회수 198

부모쓰레드 개념 질문입니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

안녕하세요, 강의 중, 모든 쓰레드는 직접적으로 만들 수 없고 메인쓰레드에 의해서 생성이 된다고 하셨던 부분에 대해서 궁금한 점이 있어서 질문을 남깁니다. 자바 말고 스프링의 경우에도 1개의 메인쓰레드가 N개의 요청에 따른 스레드를 생성해주는 구조일까요? 요청당 1개의 스레드를 차지하는데 이 경우에는 어떻게 되는지 궁금합니다 ~

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
황보협 댓글 1 좋아요 0 조회수 213

56강에 대한 질문입니다(BoundedMain).

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] package thread.bounded; import static util.MyLogger.log; public class ProducerTask implements Runnable { private BoundedQueue queue; private String request; public ProducerTask(BoundedQueue queue, String request) { this.queue = queue; this.request = request; } @Override public void run() { log("[생산 시도] " + request + " -> " + queue); log("[생산 완료] " + request + " -> " + queue); } } package thread.bounded; import static util.MyLogger.log; public class ConsumerTask implements Runnable { private BoundedQueue queue; public ConsumerTask(BoundedQueue queue) { this.queue = queue; } @Override public void run() { log("[소비 시도] ? <- " + queue); String data = queue.take(); log("[소비 완료] " + data + " <- " + queue); } } package thread.bounded; public interface BoundedQueue { void put(String data); String take(); } package thread.bounded; import java.util.ArrayList; import java.util.List; import static util.MyLogger.log; import static util.ThreadUtils.sleep; public class BoundedMain { public static void main(String[] args) { // 1. BoundedQueue 선택 BoundedQueue queue = new BoundedQueueV1(2); // 2. 생산자, 소비자 실행 순서 선택, 반드시 하나만 선택! producerFirst(queue); // 생산자 먼저 실행 //consumerFirst(queue); // 소비자 먼저 실행 } private static void producerFirst(BoundedQueue queue) { log("== [생산자 먼저 실행] 시작, " + queue.getClass().getSimpleName() + " =="); List<Thread> threads = new ArrayList<>(); startProducer(queue, threads); printAllState(queue, threads); startConsumer(queue, threads); printAllState(queue, threads); log("== [생산자 먼저 실행] 종료, " + queue.getClass().getSimpleName() + " =="); } private static void consumerFirst(BoundedQueue queue) { log("== [소비자 먼저 실행] 시작, " + queue.getClass().getSimpleName() + " =="); List<Thread> threads = new ArrayList<>(); startConsumer(queue, threads); printAllState(queue, threads); startProducer(queue, threads); printAllState(queue, threads); log("== [소비자 먼저 실행] 종료, " + queue.getClass().getSimpleName() + " =="); } private static void startProducer(BoundedQueue queue, List<Thread> threads) { System.out.println(); log("생산자 시작"); for (int i = 1; i <= 3; i++) { Thread producer = new Thread(new ProducerTask(queue, "data" + i), "producer" + i); threads.add(producer); producer.start(); sleep(100); } } private static void startConsumer(BoundedQueue queue, List<Thread> threads) { System.out.println(); log("소비자 시작"); for (int i = 1; i <= 3; i++) { Thread consumer = new Thread(new ConsumerTask(queue), "consumer" + i); threads.add(consumer); consumer.start(); sleep(100); } } private static void printAllState(BoundedQueue queue, List<Thread> threads) { System.out.println(); log("현재 상태 출력, 큐 데이터: " + queue); for (Thread thread : threads) { log(thread.getName() + ": " + thread.getState()); } } } package thread.bounded; import java.util.ArrayDeque; import java.util.Queue; import static util.MyLogger.log; public class BoundedQueueV1 implements BoundedQueue { private final Queue<String> queue = new ArrayDeque<>(); private final int max; public BoundedQueueV1(int max) { this.max = max; } @Override public synchronized void put(String data) { if (queue.size() == max) { log("[put] 큐가 가득 참, 버림: " + data); return; } queue.offer(data); } @Override public synchronized String take() { if (queue.isEmpty()) { return null; } return queue.poll(); } @Override public String toString() { return queue.toString(); } } C:\Users\lgh80\.jdks\temurin-21.0.4\bin\java.exe --enable-preview "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\lib\idea_rt.jar=52674:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\java-adv1\out\production\java-adv1 thread.bounded.BoundedMain 09:38:16.411 [ main] == [생산자 먼저 실행] 시작, BoundedQueueV1 == 09:38:16.413 [ main] 생산자 시작 09:38:16.424 [producer1] [생산 시도] data1 -> [] 09:38:16.425 [producer1] [생산 완료] data1 -> [] 09:38:16.531 [producer2] [생산 시도] data2 -> [] 09:38:16.532 [producer2] [생산 완료] data2 -> [] 09:38:16.642 [producer3] [생산 시도] data3 -> [] 09:38:16.642 [producer3] [생산 완료] data3 -> [] 09:38:16.752 [ main] 현재 상태 출력, 큐 데이터: [] 09:38:16.754 [ main] producer1: TERMINATED 09:38:16.754 [ main] producer2: TERMINATED 09:38:16.754 [ main] producer3: TERMINATED 09:38:16.755 [ main] 소비자 시작 09:38:16.757 [consumer1] [소비 시도] ? <- [] 09:38:16.757 [consumer1] [소비 완료] null <- [] 09:38:16.864 [consumer2] [소비 시도] ? <- [] 09:38:16.865 [consumer2] [소비 완료] null <- [] 09:38:16.974 [consumer3] [소비 시도] ? <- [] 09:38:16.975 [consumer3] [소비 완료] null <- [] 09:38:17.085 [ main] 현재 상태 출력, 큐 데이터: [] 09:38:17.085 [ main] producer1: TERMINATED 09:38:17.086 [ main] producer2: TERMINATED 09:38:17.086 [ main] producer3: TERMINATED 09:38:17.086 [ main] consumer1: TERMINATED 09:38:17.087 [ main] consumer2: TERMINATED 09:38:17.087 [ main] consumer3: TERMINATED 09:38:17.087 [ main] == [생산자 먼저 실행] 종료, BoundedQueueV1 == Process finished with exit code 0 이런 식으로 출력이 뜨는데 강의 내용에 나와있는 로그 창이랑 많이 달라서 강의 코드랑도 비교해봤는데 어디에서 문제가 있는 건지 잘 모르겠습니다.

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
lgh8079 댓글 2 좋아요 0 조회수 224

인터럽트에 대해 질문 있습니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

public class ThreadStopMainV2 { public static void main(String[] args) throws InterruptedException { Job job = new Job(); Thread thread = new Thread(job); thread.start(); Thread.sleep(4000); log("작업 중단 지시 interrupt"); thread.interrupt(); log("main 스레드 끝"); } static class Job implements Runnable { @Override public void run() { while (true) { try { log("스레드 실행"); Thread.sleep(2000); } catch (InterruptedException e) { log("예외 발생"); break; } } log("작업 끝"); } } } 위 코드의 실행 결과는 아래와 같습니다. 궁금한 부분은 로그에서 작업 중단 지시 interrupt 이후에 대해 궁금한점이 있습니다. 작업 중단 지시 interrupt 를 로그로 찍고 thread.interrupt();를 호출 했습니다. 그러면 생선한 스레드에 interrupt 신호를 보내고 Thread.sleep(2000); 부분에서 예외가 발생해 catch 문으로 빠지는것도 이해했습니다. 하지만 catch 문으로 빠지기전 log("스레드 실행"); 가 실행되지 않나 라는 생각이 듭니다. 그래서 최종 결과는 아래와 같이 catch 로 빠지기전에 스레드 실행이 한번 더 찍혀야 하지 않나 라는 생각이 듭니다. 23:08:15.622 [ Thread-0] 스레드 실행 23:08:17.629 [ Thread-0] 스레드 실행 23:08:19.613 [ main] 작업 중단 지시 interrupt 23:08:19.613 [ Thread-0] 스레드 실행 23:08:19.614 [ main] main 스레드 끝 23:08:19.614 [ Thread-0] 예외 발생 23:08:19.616 [ Thread-0] 작업 끝

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
감바스 댓글 1 좋아요 0 조회수 320

this에 대해 질문 있습니다.

해결됨

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

객체를 생성하는 순간 힙 영역에 객체가 저장(필드값)된다고 알고 있습니다. 메서드를 호출하기 위해서는 우선 객체를 생성한 후에 메서드를 호출해야 한다고 생각합니다. 궁금한 부분은 언제 메서드 프레임의 this에 값이 저장 되는지 궁금합니다. 메서드 호출 할때 힙 영역에 저장되어 있는 객체의 주소값이 this로 저장이 되는건가요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
감바스 댓글 1 좋아요 0 조회수 252

main 스레드와 생성한 스레드 관계에 대해 질문 있습니다.

해결됨

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

자바 실행 시 main 스레드가 생성되고 실행이 되다가 중간에 아래와 같이 스레드를 하나 생성한다고 하겠습니다. MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); 이럴 경우 생성한 스레드가 종료 상태가 될때 까지 main 스레드가 기다리는지 아니면 main 스레드는 생성한 스레드의 상태와 아무 관련없이 종료 상태가 되는지 궁금합니다.

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
감바스 댓글 1 좋아요 0 조회수 232

강의 10분 20초 부분에 대해 질문 있습니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

운영제체 관점에서 보면 다음과 같이 구분할 수 있다. 워드 프로그램 - 프로세스A 스레드1: 문서 편집 스레드2: 자동 저장 스레드3: 맞춤법 검사 유튜브 프로세스B 스레드1: 영상 재생 스레드2: 댓글 강의 내용중에 위와 같은 내용이 있습니다. 유튜브라는 프로세스가 실행이 되고 영상 재생을 담당하는 스레드1이 생기고 댓글을 담당하는 스레드2가 생긴다고 했을때 영상 재생은 계속해서 사용자한테 보여줘야 하므로 스레드1이 쭉 영상 재생을 담당할거 같은데 댓글 같은 경우는 스레드2가 어떻게 동작하는지 궁금합니다. 댓글을 작성할때마다 스레드2가 생성되서 해당 댓글을 담당 한다는 건지 아니면 딱 하나의 스레드2가 생성이 되고 이 스레드2가 여러 사용자들의 댓글 작성 요청에 대해 관리를 하는건지 궁금합니다.

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
감바스 댓글 2 좋아요 0 조회수 180

자식 프로세스를 쓰는 이유

미해결

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

안녕하세요 선생님, 강의 정말 잘 듣고 있습니다. 2장의 내용을 복습하다가 궁금한 점이 생겼어요 여러개의 자식 프로세스를 사용하는 것과 멀티스레드를 사용하는 것의 목적이 서로 상이할까요? 아파치의 woker mpm 방식의 경우에는 자식 프로세스도 여러 개 생성하고 각각의 자식 프로세스들이 멀티 스레드 방식을 사용하고 있어서요... 어떤 이점을 취할 수 있는 경우에 자식 프로세스를 혹은 멀티 스레드를 선택하는 건가요? 제가 생각하기로 멀티스레드만을 사용할 경우에는 비교적 메모리 리소스를 효율적으로 사용할 수 있지만, 가용성을 위해 여러 대의 서버 장비를 두어야 하고 자식 프로세스가 많을 경우 한 서버의 자원은 많이 먹지만 하나의 장비 내 가용성이 높아지지 않을까 추측하고 있습니다...

  • java
  • 동시성
  • multithread
  • synchronisation
댓글 1 좋아요 0 조회수 217

커널 모드 전환시 질문이 있습니다!

미해결

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

안녕하세요 선생님, 강의 잘 듣고 있습니다! 강의 중 궁금한 점이 있어서 질문드립니다.. ㅎㅎ 커널모드로 전환 시 시스템 콜과 응용 프로그램 사이에 라이브러리라고 표기가 되어있던데, 자바일 경우 JNI를 의미하는 것이 맞으실까요??.. 병렬 스트림 사용에 대한 예시를 구글링 해보면, 따로 스레드 풀을 생성해서 만들지 않을 경우, 하나의 common 스레드 풀을 공유하여 사용해 스레드가 부족하게 될 경우를 대비해, 따로 별도의 포크조인 스레드 풀을 생성하라는 가이드가 많은데요, 무분별하게 스레드 풀을 많이 생성했을 경우에 생기는 문제점들이 어떤 것이 있을지 알 수 있을까요?.. i/o가 잦은 프로세스에서 스레드의 개수가 많아 스레드들간의 컨텍스트 스위칭이 많은 경우에는 메모리 점유 외에 프로세스 성능에 크게 영향을 주지 않을 것이라고 생각 중이지만 다른 사이드 이펙트가 있을까 하여 질문 드립니다! 감사합니다 :)

  • java
  • 동시성
  • multithread
  • synchronisation
hylim 댓글 1 좋아요 0 조회수 165

Interrupted() 질문드립니다.

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

안녕하세요! 스레드 강의 정말 잘 듣고 있습니다~ 인터럽트에서 궁금한점이 있어서 질문드립니다. isInterrupted()는 Thread.currentThread에서 실행할 수 있고, interrupted()는 Thread에서 실행할 수 있는데 그럼 혹시 다른 스레드에서 인터럽트를 실행해도 Thread.interrupted()에 걸릴까 싶어 테스트를 해보니 그러지는 않더라구요. Thread.interrupted의 내부를 보니 currentThread()를 호출하긴하던데, Thread.currentThread.interrupted()가 안되는 이유는 스레드의 내부적인 부분으로 보면 될까요? 궁금해서 혹시하고 질문드렸습니다ㅠ

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
suco 댓글 1 좋아요 0 조회수 130

notifyall에서 질문

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 마지막 notifyall에서 만약에 c1 다음에 p1이 락을 획득하면 나머지 c2, c3, c4, c5는 대기집합에 들어가나요 아니면 깨어있는 상태로 계속있나요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
썩은도토리 댓글 2 좋아요 0 조회수 187

synchronized lock 획득 질문, 스프링에서 synchronized 질문

해결됨

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

이해 확인에 대한 질문입니다. synchronized는 메서드에서 현재 getBalance()랑 withdraw()에서 선언되었는데, lock은 객체가 가지고있다고 이해하고있습니다. synchronized 메서드가 실행시 lock을 가지고 간다면 synchronized가 선언되지 않은 메서드(동일 클래스)는 자유롭게 실행이 가능한거고, 만약 synchronized withdraw가 스레드1에서 실행중이라면 스레드2가 synchronized getBalance()시 락을 획득할 수 없어서 대기해야하는 것이 맞나요? 2. 제가 스프링 DB2까지 강의를 듣고있는데, 스프링에서는 실제로 WAS의 스레드 풀에서 기본적으로 많은 스레드를 확보해두고 있는 것으로 알고있습니다. 해당 강의들에서 synchronized를 사용해본 기억은 없는 것 같아요. 기본적으로 스프링은 synchronized가 필요한 부분에 구현이 되어있는 걸까요?(싱글톤 빈에 대한 질문입니다!) 아니면 멀티스레드의 측면도 개발자가 직접 테스트하면서 최적화가 필요할까요?(아마 제 예상으로는 개발자가 직접하는 부분도, 스프링이 해주는 부분도 있을 것 같은데...) 스프링 고급편, 부트편이나 JPA 학습 시점에 알 수 있는 부분일까요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
영한노게임 댓글 2 좋아요 0 조회수 360

JoinMainV0에 관한 질문

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 이런 식으로 출력이 되는데 코드에 어떤 문제가 있는 건가요?? Start 작업 시작 작업 시작 End 작업 완료 작업 완료 이런 식으로 출력 값이 떠야 하는데 어떤 문제가 있는 건가요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
lgh8079 댓글 2 좋아요 0 조회수 177

close()메소드

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

ExecutorService에서 close()메소드가 없다고 나오는데 close() 대신 shutdown()을 사용하는 건가요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
신토리 댓글 1 좋아요 1 조회수 288

메서드 영역에 있는 상수풀이

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 자바 8이후로는 힙 영역에 있다고 하는데 맞나요?? 자료에는 메서드 영역에 있길래 여쭤봅니다

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
yuntyu01 댓글 1 좋아요 0 조회수 145

개념이랑 원리는 이해하고

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 실사용은 Executor(멀티스레드), Look(동시성)을 위주로 사용하는 거죠?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
yuntyu01 댓글 1 좋아요 -3 조회수 259

unlock()을 호출 했을 때

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

ReentrantLock에서 lock.unlock()을 호출하면, 대기 중인 스레드들이 락을 획득하려고 서로 경쟁하게 됩니다. 제가 이해한 바로는, unlock이 호출된 후 스레드들중 락을 획득한 한개의 스레드는 RUNNABLE 상태로 전환되고, 나머지 락을 획득하지 못한 스레드들은 다시 WAITING 상태로 돌아가는 것이라고 알고 있습니다. 이 과정에서 스레드들이 경쟁하는 순간의 상태가 정확히 어떻게 되는지 궁금합니다. 경쟁순간에는 락을 획득하려는 스레드들 모두 RUNNABLE 상태인가요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
yummngi 댓글 1 좋아요 0 조회수 256

인기 태그

인프런 TOP Writers

주간 인기글