inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

cpu 개수만큼 실제로 할당되는지.. 궁금합니다.

미해결

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

강의에서 cpu 개수만큼 데이터 생성하고 병렬처리 하셨는데요. 실제로 cpu 개수만큼 java 런타임에 모두 할당이 되나요? https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html 여기 문서보니까, 자바에 할당된 cpu 개수를 의미하는거 같기도하고요.. chatgpt 는 운영체제에 할당된걸 인식하는거라고 하는데 뭔지 잘모르겠네용

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

뮤텍스 수도 코드에 대한 질문

미해결

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

락을 점유중인 스레드만이 락을 해제할 수 있으므로 release에 while문은 필요없지않나요? 1. 락을 점유한 스레드만이 release할 수 있음. 2. 즉 release할때는 하나의 스레드만이 접근 가능함. 3. 고로 release에 있는 while문은 필요가없음. 추가로 제공해주신 아래 코드에서 lock 변수가 강의에서 보여주신 수도코드에서는 synchronized가 lock을 의미하고 value를 의미하는거죠?? 용어가 헷갈려서 문의드립니다. public class Mutex { private boolean lock = false; public synchronized void acquired() { while (lock) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.lock = true; } public synchronized void release() { this.lock = false; this.notify(); } }

  • java
  • 동시성
  • multithread
  • synchronisation
이민준 댓글 2 좋아요 0 조회수 469

SimpleThreadPool에 대한 질문

미해결

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

아래 코드에서 if이 왜 필요한지 궁금합니다. while문을 빠져나왔다는것은 이미 taskQueue가 비어있지않단는 뜻 아닌가요? synchronized (taskQueue) { while (taskQueue.isEmpty() && !isShutdown) { try { taskQueue.wait(); // 작업이 있을 때까지 대기 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } if (!taskQueue.isEmpty()) { task = taskQueue.poll(); // 작업 큐에서 작업 가져옴 } else { continue; // 작업이 없으면 다시 대기 } }

  • java
  • 동시성
  • multithread
  • synchronisation
이민준 댓글 1 좋아요 0 조회수 224

서버가 이중화인 경우

미해결

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

안녕하세요. synchronized, cas 등 동시성 이슈를 해결하는 기법들인데, 서버가 한대인 경우에 한해서만 위 기법들이 적용될 것 같은데요. 제가 생각한게 맞을까요? 서버를 여러 개로 실행하는 경우 DB 자체에 락을 걸고 사용해야 하나요?

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

코어갯수..

미해결

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

int cpuCores = Runtime.getRuntime().availableProcessors(); 챕터 01에 exam01 코드 실행시 cpuCores가 12개 로 나오는 이유가뭘까요 시피유가 6코어에 12쓰레드인데 쓰레드 갯수로 나오는거같아요..

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

CAS 알고리즘 질문

미해결

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

안녕하세요. CAS 이해와 활용 -1 편 강의를 듣다가 질문 드립니다. 3분쯤에 PDF 자료에 'CAS는 CPU 캐시와 메인메모리의 두 값을 비교하고 그 값이 동일할 경우 새로운 값으로 교체하는 동기화 연산으로 여러 스레드가 공유하는 메모리 영역을 보호하는 데 사용된다'라고 나와있는습니다. 그런데 이후 강의를 듣다 보면 Main Memory Value, Expected Value, New Value 이렇게 세 가지 키워드로 CAS가 진행되더라구요. 여기서 Expected Value가 PDF 설명에 나와 있는 'CPU 캐시'를 의미하는 것 같은데요(강의 19분 쯤) 기대값은 특정 블록 안에 있는 지역 변수인데 지역 변수는 JVM 스택에 저장되는 걸로 알고 있습니다. JVM 스택에 저장되는 것이 CPU 캐시인가요? 어떤 관계인지 잘 모르겠어서 질문을 드립니다ㅠ

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

lock 객체 질문

미해결

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

lock 인터페이스를 사용할 때 해당 클래스 인스턴스 변수로 선언하는데 이렇게 되면 선언한 클래스에 대한 고유 락을 가지는건가요? synchronized와 같은 방식과 같다면 상관없는데 또 다른 방식으로 생각해야 하나 싶어서요

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

사용자 모드 커널 모드 CPU 반환 시점이 궁금합니다.

미해결

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

궁금한 점 강의 내용에서 I/O작업이 필요할 경우 System Call 요청 -> Mode Bit 0 변경 -> I/O 리소스 할당 의 과정으로 시스템이 호출된다고 되어있는데 CPU를 할당 받을 때도 커널모드가 필요 한지 궁금합니다. 이유 강의 자료를 확인해보면 다른 리소스들과 같이 CPU가 존재

  • java
  • 동시성
  • multithread
  • synchronisation
기호리의우당탕탕백엔드도전기 댓글 2 좋아요 0 조회수 371

스레드 중지 – flag variable vs interrupt() - 2 강의에서 질문

미해결

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

안녕하세요. 처음 강의 부분에 스레드 1번 2번이 있는데 1번에 sleep을 주어서 컨텍스트 스위칭이 일어나 코어 캐시 메모리에서 false라는 값을 업데이트한다고 하셨는데 sleep을 주지 안 아도 시간 자원이 만료되면 자동으로 컨텍스트 스위칭이 일어나서 둘 이 번갈아 가며 실행 될 때 캐시 메모리가 비워지지 않는 건가요? 이 부분 때문에 이해가 잘 안 갑니다. 아니면 멀티 코어 환경이라 스레드1 캐시 메모리는 그대로 true고 sleep으로 인해서 초기화가 된건가요?

  • java
  • 동시성
  • multithread
  • synchronisation
hoonseung 댓글 2 좋아요 0 조회수 332

현재 자바 스레드 모델

미해결

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

안녕하세요 강사님 강의에서 현재 자바에서 채택되어 사용 중인 스레드 모델이 일대일이라고 하셨는데 또 인터넷에 찾아보면 다대 다이라고 하더라구요 무엇으로 이해하면 될까요.?

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

native 자바 스레드 동작 원리 질문

미해결

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

안녕하세요. 강사님 제가 이해하고 있는 게 맞는지 궁금하여 질문드립니다. 자바 코드에서 두 개의 스레드를 생성하여 실행될 때의 아래 메커니즘이 맞을까요..? ↓ ↓ ↓ 1. thread.start를 두 번 하여 시스템 콜 호출 후 커널 영역에 커널 스레드 2개 생성 후 사용자 스레드와 맵핑 -> 1 코어 하드웨어 스레드 1개가 OS 스케줄러에 의해 2개의 커널 스레드를 반복 선택하여 실행 (매핑된 사용자 스레드같이 반복) (이 부분에서 자바 스레드는 기본적으로 동시성 방식으로 작동하고 작업을 병렬 방식으로 처리를 해야지 N 개의 코어를 사용하여 동시 처리되는 건가요?) -------------------------------------------------- 2. 커널 스레드는 사용자 스레드의 존재를 모르고 프로세스의 존재만 알고 있으며 PCB 정보를 가지고 있기 때문에 커널 스레드 TCB에 사용자 스레드 컨텍스 정보들을 저장하여 게속 스위칭을 반복하며 처리

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

쓰레드풀에서 쓰레드를 재사용할 수 있는 이유가 궁금합니다.

미해결

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

강의 초반부 스레드는 start해서 작업이 끝나면 재사용할 수 없다고 하셨고 자바독에서도 아래와 같이 start()가 재사용되는 것은 legal하지 않다고 표현하고 있습니다 It is never legal to start a thread more than once. I n particular, a thread may not be restarted once it has completed execution. 그런데 스레드풀 재사용 시에는 뭔가 다른 작업이 있을까 해서 강의와 함깨 디버깅해보니 addWorker()에서도 Worker에 할당된 스레드의 start()메소드로 호출하고 있었습니다. 스레드 풀의 경우 start()호출 후 메소드가 종료되었음에도 스레드를 재사용할 수 있는 이유는 무엇인가요? 질문을 작성하고 나서 조금 더 고민해보니 아래와 같은 결론에 도달했습니다.(혹시 틀린 내용이 있다면 수정 의견 부탁드립니다) 비슷한 고민을 하신 분이 있을 것 같아 글을 남겨둡니다. 생성된 스레드의 start() 실행 -> Worker의 run()실행 -> Worker의 runWorker()실행 -> while()조건에 의해 무한 루프 무한루프가 되는 이유 : getTask()를 통해 큐에서 작업을 꺼내와 실행하고 큐에 작업이 없을 경우 블록킹되므로 블로킹이 해제된 시점에서는 task변수에 작업이 할당되어 while조건문이 true가 됨

  • java
  • 동시성
  • multithread
  • synchronisation
선종우 댓글 1 좋아요 0 조회수 354

사이드 프로젝트 관련 질문 입니다.

미해결

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

안녕하세요 강사님 좋은 강의 만들어 주셔서 감사합니다. 저는 무엇인가를 만들어보며 학습하는것을 선호 하는데요. 그래서 혹시 이 강의를 통해 얻게된 지식과 관련된 사이드 프로젝트 주제가 있다면 여쭤보고 싶습니다. 감사합니다.

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

interrupt() 강의 보다 정말 궁금한게 생겨서 문의 남깁니다.

미해결

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

안녕하세요 강사님 강의를 듣다가 이상한 것을 발견하여 문의 드립니다. Java Thread Fundamentals - 스레드 기본 API > interrupt() 강의중 InterruptExample 부분의 샘플 코드를 작성하고 테스트 및 정리를 하고 있습니다. 제가 현업에서 사용하는 JDK 11 을 사용해서 연습중에 이상한 현상을 발견하였습니다. JDK 17에서는 문제 없음을 확인하였습니다. 먼저 코드 구현체 부분입니다. public class TreadInterrupt { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { System.out.println("thread 1 start"); System.out.println("thread 1 isInterrupted() = " + Thread.currentThread().isInterrupted()); }); Thread t2 = new Thread(() -> { System.out.println("thread 2 start"); t1.interrupt(); System.out.println("thread 1 isInterrupted() = " + t1.isInterrupted()); System.out.println("thread 2 isInterrupted() = " + Thread.currentThread().isInterrupted()); }); t2.start(); Thread.sleep(1000); t1.start(); t1.join(); t2.join(); System.out.println("작업 완려"); } } Thread#interrupt() , Thread#isInterrupted() 의 jdk 11과 17 버전입니다. // jdk 11 public class Thread { public boolean isInterrupted() { return isInterrupted(false); } @HotSpotIntrinsicCandidate private native boolean isInterrupted(boolean ClearInterrupted); public void interrupt() { if (this != currentThread()) { this.checkAccess(); synchronized(this.blockerLock) { Interruptible b = this.blocker; if (b != null) { this.interrupt0(); b.interrupt(this); return; } } } this.interrupt0(); } private native void interrupt0(); } // jdk 17 public class Thread { private volatile boolean interrupted; public boolean isInterrupted() { return interrupted; } public void interrupt() { if (this != Thread.currentThread()) { checkAccess(); // thread may be blocked in an I/O operation synchronized (blockerLock) { Interruptible b = blocker; if (b != null) { interrupted = true; interrupt0(); // inform VM of interrupt b.interrupt(this); return; } } } interrupted = true; // inform VM of interrupt interrupt0(); } } 위 코드와 같이 jdk 17 은 Thread 객체 내 interrupted 필드를 둠으로써 인터럽트의 상태를 관리하지만 jdk 11 같은 경우에는 native 메서드를 이용해서 인터럽트의 상태를 관리하는 것을 확인할 수 있었습니다. 이 때 jdk 11에서 위 코드를 실행시키면 결과가 아래 와 같이 출력되는것을 확인하였습니다. thread 2 start thread 1 isInterrupted() = false thread 2 isInterrupted() = false thread 1 start thread 1 isInterrupted() = false 작업 완려 프로세스 실행을 반복하거나 sleep 의 시간을 늘려보아도 항상 아래와 같은 동일한 결과가 나왔습니다. 하지만 이 코드를 디버그 모드를 이용해서 동작시킨 경우 완전히 다른 결과가 나왔습니다. break point 는 t1.interrupt() 부분에 걸었으며 실제 인터럽트 내부 코드 동작 부분은 확인하지 않고 F8 을 이용해서 코드라인을 프로세스가 종료할 때 까지 넘김 thread 2 start thread 1 start thread 1 isInterrupted() = true thread 1 isInterrupted() = true thread 2 isInterrupted() = false 위는 실제로 디버그 모드로 동작 시켰을때 처리 결과입니다. 아무리 생각해도 동일한 코드, 동일한 로직인데 디버그 모드일때 정상적으로 출력되고 일반적으로 실행하였을때 인터럽트의 상태가 모두 false 가 나온다는 것이 이해되지 않아 문의 남겨봅니다.

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

어떻게 상호배제가 이루어지는지 잘 이해가 안갑니다

해결됨

Backend 멀티쓰레드 이해하고 통찰력 키우기

private void Write() { // 다른 스레드가 읽기나 쓰는지 검증 ... var request = DateTime.Now .ToString(); Interlocked.Increment(ref writeCount); //...쓰기작업 } 03:40 부분의 내용입니다 스레드1 이 var request = DateTime.Now .ToString(); 이 부분을 실행할때는 아직 writeCount 가 0인 상태인데 이때 스레드2가 writeCount와 readCount 0인거 확인하고 들어올 위험은 없는건가요? 어떻게 상호배제 되는지 이해가 안갑니다!

  • C#
  • mysql
  • kafka
  • redis
  • multithread
우웅 댓글 2 좋아요 1 조회수 484

임계영역에 2개 이상의 스레드가 올 수 있는지요?

해결됨

Backend 멀티쓰레드 이해하고 통찰력 키우기

안녕하세요 섹션4 코드를 보면 requests 라는 오브젝트 키를 사용해서 스레드1과 스레드2가 임계영역을 이용중인데 서버 함수를 보면 일이 없으면 lock 안에서 wait 즉 대기 상태로 빠집니다 그리고 클라 함수를 보면 일을 넣어주고 다른 스레드를 깨웁니다 여기서 의문인게 임계영역 안에서 대기중인 스레드와 실행중인 스레드가 공존할 수 있나요 https://www.inflearn.com/questions/1046075 제가 다른 수업에서 한 질문인데 답변에는 ai 답변이긴 하지만 그럴 수 없다고 들어서 질문드립니다

  • C#
  • mysql
  • kafka
  • redis
  • multithread
우웅 댓글 2 좋아요 0 조회수 440

다대일과 다대다 스레드 매핑 Block I/O시 질문

미해결

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

다대일에서 한 스레드가 I/O 발생 시 프로세스 자체를 블록하기 때문에 모든 스레드들이 Block이 발생하는데 다대다에서는 한 스레드가 I/O 발생 시 커널이 다른 스레드의 수행을 스케줄할 수 있는 이유가 궁금합니다. 다대일도 다대다처럼 커널이 다른 스레드의 수행을 스케줄하면 안되나요? 왜 다대일만 프로세스 블록시키고 다대다는 프로세스를 블록시키지 않고 모든 스레드들이 Block이 발생하지 않나요?

  • java
  • 동시성
  • multithread
  • synchronisation
최낙도 댓글 2 좋아요 0 조회수 352

강의 내용 블로그에 정리해서 포스팅해도 괜찮을까요!

해결됨

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

안녕하세요 강사님! 시큐리티부터 열심히 수강중입니다! 혹시 강의내용을 정리해서 블로그에 포스팅 해도 괜찮을까요? 항상 좋은 강의 올려주셔서 감사합니다!

  • java
  • 동시성
  • multithread
  • synchronisation
열심히 공부하겠습니다! 댓글 1 좋아요 0 조회수 429

lock을 사용했음에도 병렬처리가 더 빠른 이유가 궁금합니다.

해결됨

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

안녕하세요 강사님 강의(싱글스레드 & 멀티스레드)를 듣다가 궁금한 점이 생겼습니다.예제 코드에서 1 ~ 1000을 더하는 for문의 실행시간은 약 2초 정도가 나오고 이를 2개의 스레드로 처리하면 약 1초 정도가 나왔는데요.synchronized키워드를 이용해서 lock을 걸 경우 해당 자원에는 하나의 스레드만 접근하게 되므로 예제의 경우 사실상 병렬처리가 불가능함에도 처리속도가 더 빠른 이유는 무엇인가요? 사양은 다음과 같습니다 : 인텔 ® 코어 ™ i5 - 7500 프로세서 ; 스레드 수. 4 ; GPT 도움을 받아 아래와 같이 추측해 봤는데 맞을까요? 싱글스레드 프로그램 : sleep(1)초에 의해 for루프 안에서 sleep 상태 발생 멀티스레드 프로그램 : thread1의 sleep동안 thread2가 연산 수행 -> 싱글스레드와 다르게 sleep 상태에 의해 지연되는 시간이 없음

  • java
  • 동시성
  • multithread
  • synchronisation
선종우 댓글 2 좋아요 1 조회수 403

현재 제가 겪고 있는 상황인데 조언 부탁드립니다.

미해결

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

SpringBoot 에서 멀티 스레드로 크롤러가 돌아가는 프로젝트 입니다. junit 테스트 코드를 통해 크롤러가 10개 정도 게시판 페이지를 정상적으로 가져오는지 확인하려고 하는데요. 현재 작성된 테스트 케이스는 아래와 같습니다. @Test void crawlerTest() { // 크롤링 시작 crawlerRun(); while(스레드풀 작업 종료됐나??) { // 작업이 안끝났으면 Thread.sleep(5000); } } while 문이 있으면 정상적으로 10개의 게시판 페이지를 크롤링한 이후 DB에 적재됩니다. 다만 강의를 보면서 while 문이 없어도 되지 않을까 생각해서 삭제하거나 주석처리하면 올바르게 동작하지 않습니다. [while 문 제거 후] 디버깅을 통해 값이 제대로 들어오는지 확인하면서 테스트 케이스를 돌리면 4~5 개정도만 DB 에 크롤링한 데이터가 저장되고 갑자기 오류도 없이 테스트가 종료됩니다. 디버깅없이 그냥 실행시키면 6개 정도 DB에 저장되고 테스트가 종료됩니다. crawlerTest() 라는 테스트 코드가 Main Thread 라고 쳤을 때 다른 Thread 들은 정상적으로 동작 중이어야 하지 않나요..? 아니면 Spring 환경이라서 이런 문제가 발생하는 것인지 junit 테스트 코드라서 이런 문제가 발생하는건지 궁금합니다! ( Daemon Thread 는 아닙니다! )

  • java
  • 동시성
  • multithread
  • synchronisation
AAPPII 댓글 2 좋아요 0 조회수 568

인기 태그

인프런 TOP Writers

주간 인기글