묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
16:50부분에서 타입락 질문드립니다.
ResourceA의 methodA메서드가 호출될때 ResourceA.cass락이 1번쨰로걸리고 ResourceB.class락이 두번째로 걸리고나서 ResourceB.class락이걸린상태에서 resourceB.methodB2()메서드가 호출되는데 resourceB.methodB2()메서드 내부에서 ResourceB.class락으로 컨트롤 하고있는데 ResourceA의 두번째 락에서 ResourceB.class로 락을 반환하지않은상태에서 실행된다고 생각하는데 resourceB.methodB2()의 내부는 어떻게 실행되는걸까요? 정리methodA()ResourceA1번째락 > ResourceA.cassmethodA()ResourceA2번째락 > ResourceB.cassResourceA2번째락내부에서 resourceB.methodB2()실행resourceB.methodB2()내부는 ResourceB.cass락질문사항methodA()ResourceA2번째락에서ResourceB.cass을 점유하고있는데 resourceB.methodB2()도 ResourceB.cass락으로 블록락 실행중인데도 불구하고 점유 가능한 이유가 무엇인가요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
16분 7초 뮤텍스 코드 관련해 질문드립니다.
release(m)에서 마지막에 lock = 0 을 해주어야 acquired(m)에서 해당 lock을 사용할 수 있는거 아닌가요..? 또한 a스레드에 의해 락이 획득된 상태에서, block() 함수를 통해 대기상태로 변하고 > 이후 release(m)를 통해 실행대기 상태로 변한 스레드들은 ( 목적이 critical section의 실행 ) do - while 구문을 통해 critical section을 반복적으로 실행할 수 있도록 되는 건가요?? 실행 대기 상태로 돌아왔을 때 어떻게 다시 락 획득 프로세스를 다시 진행할 수 있는 건지 알고 싶습니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
동기화가 보장된다고 하더라도 스레드간 데이터 불일치가 발생할 수 있지 않나요??
강의 잘 듣고 있습니다.질문 드릴 것이, 동기화가 보장되어서 각 스레드 별로 원자적으로 연산을 한다고 하더라도 CPU 레지스터에서 이루어지는 연산이기 때문에 메모리에 바로 적용되지는 않는거 아닌가요? 동기화 매커니즘과 동시에 atomic 혹은 volatile 을 선언해야 하는 거 아닌가요??
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
리액티브-part2
안녕하세요 강의내용과는 다른 질문인데요.part1 다음의 part2 강의도 계획중신건가요??만약 part2도 있다면 part2는 어떤 내용애 관한 강의인지 궁금하니다!
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
문자열 풀 값을 이용한 String 변수
강의에서 각 스레드 스택 마다 지역변수로 objectReference 참조 변수를 생성하시는 것을 예시로 들어주셧는데요, 해당 변수는 문자열 풀 값들을 이용해서 만들어진 것이잖아요.힙에 저장될 때 어떻게 데이터가 저장되나요? thread 1번에서 생성한 지역변수인 objectReference 는"1" 의 문자열 풀 주소값 + ": Hello World" 의 문자열 풀 주소값, thread 2번에서 생성한 지역변수인 objectReference 는"2" 의 문자열 풀 주소값 + ": Hello World" 의 문자열 풀 주소값,...이렇게 저장되는 것이 맞을까요?? 혹은 "1 : Hello World" 라는 문자열 전체가 하나의 스트링 풀에 저장되고, 그 상수에 대한 주소값이 저장되는 것일까요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
스레드 라이브러리는 커널과 같은 역할을 하지 못하나요?
강의와 다른 질의응답을 확인하였을 때, 사용자 수준에서 사용자 레벨 스레드 생성을 스레드 라이브러리가 관리하고, 관리의 범위는 스레드의 생성 및 소멸, 스케쥴링, 컨텍스트 스위칭을 할 수 있다고 말씀해주셨습니다! 그런데 다대일 스레드 매핑 모델의 특징에서 한 프로세스에 속해있는 사용자 수준 스레드들 중 하나가 block되면 프로세스 전체가 block이 되는데, 이는 커널에서 프로세스가 가지고 있는 개별적인 스레드를 인지하지 못하고, 그냥 하나의 스레드로 인지해서 대체할 스레드를 찾지 못함이라고 질의응답에서 확인 하였는데요, 강의 내용대로 스레드 라이브러리가 사용자 스레드를 관리하기 위해 많은 작업을 하고 있는데, 사용자 스레드 라이브러리에서 사용자 수준 스레드 중 일부가 블락되었을 때 커널 대신 다른 대기 중인 스레드를 ready > run 상태로 변경할 수는 없는 건가요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
자식 프로세스를 쓰는 이유
안녕하세요 선생님, 강의 정말 잘 듣고 있습니다.2장의 내용을 복습하다가 궁금한 점이 생겼어요 여러개의 자식 프로세스를 사용하는 것과 멀티스레드를 사용하는 것의 목적이 서로 상이할까요? 아파치의 woker mpm 방식의 경우에는자식 프로세스도 여러 개 생성하고 각각의 자식 프로세스들이 멀티 스레드 방식을 사용하고 있어서요... 어떤 이점을 취할 수 있는 경우에 자식 프로세스를 혹은 멀티 스레드를 선택하는 건가요? 제가 생각하기로 멀티스레드만을 사용할 경우에는 비교적 메모리 리소스를 효율적으로 사용할 수 있지만, 가용성을 위해 여러 대의 서버 장비를 두어야 하고자식 프로세스가 많을 경우 한 서버의 자원은 많이 먹지만 하나의 장비 내 가용성이 높아지지 않을까 추측하고 있습니다...
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
커널 모드 전환시 질문이 있습니다!
안녕하세요 선생님,강의 잘 듣고 있습니다! 강의 중 궁금한 점이 있어서 질문드립니다.. ㅎㅎ 커널모드로 전환 시 시스템 콜과 응용 프로그램 사이에 라이브러리라고 표기가 되어있던데, 자바일 경우 JNI를 의미하는 것이 맞으실까요??.. 병렬 스트림 사용에 대한 예시를 구글링 해보면, 따로 스레드 풀을 생성해서 만들지 않을 경우, 하나의 common 스레드 풀을 공유하여 사용해 스레드가 부족하게 될 경우를 대비해, 따로 별도의 포크조인 스레드 풀을 생성하라는 가이드가 많은데요,무분별하게 스레드 풀을 많이 생성했을 경우에 생기는 문제점들이 어떤 것이 있을지 알 수 있을까요?.. i/o가 잦은 프로세스에서 스레드의 개수가 많아 스레드들간의 컨텍스트 스위칭이 많은 경우에는 메모리 점유 외에 프로세스 성능에 크게 영향을 주지 않을 것이라고 생각 중이지만 다른 사이드 이펙트가 있을까 하여 질문 드립니다! 감사합니다 :)
-
해결됨자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
[공유] setName 시 threadName이 1부터 시작하는 이유
해당 강의 10분 경 나온 설명으로, setName 메소드 자체가 스레드 이름에 영향을 주나? 싶은 궁금증이 들어서 확인해 보았고, 저와 비슷한 궁금증을 가지신 분들이 계실 것 같아 공유드립니다. setName은 Thread name 생성 로직에는 관여하지 않습니다. 다만, 해당 예제에서는 new Thread()로 이름 없는 스레드를 생성 후(이 때 Thread-0으로 생성), 해당 Thread를 setName을 통해 Thread name을 바꿔주고 있어서, setName을 사용하면 1부터 카운트되는 것 처럼 보였던 것입니다. -> 새로 생성된 스레드의 이름은 Thread-0-> Thread-0이 yourThread로 치환됨 yourThread를 생성하는 부분에서 Thread의 이름을 임의로 넣어주고, 아래에서 스레드를 생성하면 0번부터 생성됨을 확인할 수 있습니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
synchronized = 모니터
안녕하세요!좋은강의 해주셔서 감사합니다!저는 모니터라는 개념에 대해 잘 이해를 못하다가 이번 강의를 통해 좀 알것 같기도 한데 애매한 부분이 있어서 질문드리고자 합니다~강의 내용을 보면 synchronized = 모니터라고 볼 수 있을 것 같은데, 41분쯤에 장표에서 나온 모니터는 lock.wait()과 lock.notify()로 구현되어있잖아요!그런데 저는 지금까지 동기화 코드를 작성할때 Object클래스의 wait()이나 notify()함수를 사용안하고, synchronized만 사용해도 동기화가 잘 됬던것 같거든요!synchronized만 사용할때랑 자바 모니터로 구현할때랑 무엇이 다른건지 아직 좀 잘 모르겠습니다..
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
Thread의 Context Switching 문의드립니다.
Context Switch 강의에서 예제로 3개의 Thread를 생성해서 실행하는데, 이게 Context Swtiching에 의한 예로 볼 수 있다고 해주셨습니다.근데 이전에 ThreadPoolExecutor를 이용할 경우 여러 개의 코어 프로세스를 이용하여 Thread를 병렬성 + 동시성 실행시킬 수 있었는데, 해당하는 예제에서는 하나의 코어에서 3개의 Thread를 실행시켜서 컨텍스트 스위칭이 일어나는 것으로 보아도 괜찮은걸까요?만약 예제 코드가 ThreadPoolExecutor처럼 3개의 코어가 있을 때 3개의 스레드가 개별적으로 동작한다면 컨텍스트 스위칭이 일어나지 않는다라고 볼 수 있을 것 같아서요!기본적으로 SpringBoot를 이용하여 Tomcat 서버로 구동이될 때, 요청마다 생성되는 쓰레드는 여러 개의 코어에 분배되어 처리되는 것일까요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
동기 & 논블록킹 질문 드립니다.
안녕하세요 강의 듣다 궁금증이 생겨 질문 드립니다.강의자료 343p 보면 동기 & 논블록킹에 대한 예시 그림이 나오는데요.1) T1이 수행중인 Task4 에서 T2의 Task3, T3의 Task5 의 작업을 기다리고 있어 스레드 T1은 부분적으로 동기처리 된다고 이해했습니다. 이 내용이 맞을까요?2) " Wait and Acknowledge " 부분에서 T1이 T2, T3의 작업결과를 가져와야 다음 작업을 수행할 수 있으므로 동기이면서 Blocking이 발생할 것 같은데요. (ex. Future.get 으로 구현할 경우) 그림만 봐서는 Non-blocking방식인 것 같아 생각해보니, T1이 BusyWaiting방식으로 loop안에서 T1, T2의 완료여부를 체크하는 것 같습니다. 이 내용이 맞을까요? 그렇다면, 만약 Future.get처럼 Block되는 방식의 API를 사용하면 T1은 Task4에서 Non-blocking이 아닌 Blocking된다고 이해해도 될까요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
AtomicIntegerGetAndUpdateExample 예시가 부자연스럽습니다.
AtomicInteger의 getAndUpdate가 람다를 적용하기 전의 값을 반환하므로,해당 메소드의 반환 값을 출금 후 잔고가 아니고, 출금 전 잔고로 표현하는 것이 의미가 맞습니다. 추가로 출금 전의 잔고가 출금액 보다 작아야 잔고 부족으로 출금이 실패한다고 표현해야 자연스러운 것 같습니다. 해당 예시를 다음과 같이 수정했습니다.// main function for (int i = 0; i < 5; i++) { new Thread(() -> { int withdrawalAmount = 500; // 출금액 int beforeUpdatedBalance = accountBalance.getAndUpdate(balance -> { if (balance >= withdrawalAmount) { return balance - withdrawalAmount; // 출금 성공 } else { return balance; // 출금 실패 } }); if (beforeUpdatedBalance < withdrawalAmount) { System.out.println(Thread.currentThread().getName() + " : 잔고 부족으로 출금 실패"); } else { System.out.println(Thread.currentThread().getName() + " : 출금 전 잔고: " + beforeUpdatedBalance); } }).start(); } 강의 잘 듣고 있습니다. 감사합니다 🙂
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
ReentrantLock.lockInterruptibly() 질문
먼저 강의 잘 듣고 있습니다. 강의 자료 202쪽에 보면 아래 그림과 같이 ReentrantLock.lockInterruptibly() 예제 코드가 작성되어 있는데요. 이 코드를 강의 소스코드 (LockInterruptiblyExample.java) 에 적용해 보았습니다. 적용한 코드는 아래와 같습니다. public class LockInterruptiblyExample { public static void main(String[] args) { Lock lock = new ReentrantLock(); Thread thread1 = new Thread(() -> { try { lock.lockInterruptibly(); // 락을 시도하며, 인터럽트가 들어오면 중단 System.out.println("스레드 1이 락을 획득했습니다"); } catch (InterruptedException e) { System.out.println("스레드 1이 인터럽트를 받았습니다"); } finally { lock.unlock(); System.out.println("스레드 1이 락을 해제했습니다"); } }); Thread thread2 = new Thread(() -> { try { lock.lockInterruptibly(); // 락을 시도하며, 인터럽트가 들어오면 중단 try { System.out.println("스레드 2가 락을 획득했습니다"); } finally { lock.unlock(); System.out.println("스레드 2가 락을 해제했습니다"); } } catch (InterruptedException e) { System.out.println("스레드 2가 인터럽트를 받았습니다"); } }); thread1.start(); thread2.start(); thread1.interrupt(); // thread2.interrupt(); try { Thread.sleep(500); thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } 이 코드를 실행했을 때, 아래 이미지와 같이 IllegalMonitorStateException 이 발생했는데요. 아마 try ~ catch ~ finally 블록에 의한 문제가 아닐까 싶습니다. 이 부분이 어떻게 동작하여 오류가 발생한 건지 궁금한데, 답변 해주시면 감사하겠습니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
동기화와 CPU 관계 불일치 흐름도
무릎을 탁치는 명강의였습니다. 감사합니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
예제 transfer 메서드
안녕하세요, 강사님. 강의 40분에 나오는 예제의 transfer메서드에서 호출하는 withdraw, deposit 메소드는 이미 synchronized 블록 동기화가 되어있는데 왜 또 호출전에 synchronized 블록 동기화 구문을 작성하는지 궁금합니다. 감사합니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
corePoolSize & maximumPoolSize 수강 중 질문입니다.
corePoolSize & maximumPoolSize - 기본 스레드 & 최대 스레드 22분 35초 정도 듣고 있는데 궁금한게 있습니다.ArrayBlockingQueue에 4개의 태스크가 모두 차면큐에 적재되지 못한 나머지 태스크는 어디서 대기 하나요?(핸들러가 없다는 가정하에) 그리고 max thread 까지 생성되면 큐에 적재되지 못한 나머지 태스크들을 max thread개수 만큼 처리하고 이후 찐으로 초과된 태스크는 처리하지 못해 Exception이 발생하나요? 뭔가 제가 이해를 잘 못하고 있는 것 같은데corePoolSize와 Queue 의 사이즈를 왜 더해서 태스크 개수와 비교하는지 이해를 못하겠어요. 태스크가 큐에 모두 채워지면 나머지 태스크 중 전체 쓰레드 개수 까지는 큐에 적재되지 못해도 처리가 된다로 이해 하면 될까요?아니면 원랜 큐가 다 차면 Exception이 발생하는데 해당 시간대의 예제에선 defaultHandler 가 뭔가 태스크가 모두 차도 쓰레드 개수만큼은 추가로 처리 할 수 있도록 뭔가 처리를 한 걸까요?--> 뒤에 더 보니 worker에서 바로 처리 하는 군요;; 추가로큐에서 태스크가 처리되면 다시 공간이 생길 것 같은데 왜 모두 차는지 이해가 잘 안되요. (제가 뭔가 잘못 알고 있는 걸까요) 강의 너무 좋습니다. 이후 강의도 빨리 내주세요 ㅠ_ㅜ
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
interrupt 스레드 시작안했는데도 걸리나요
sleep 1초 동안 thread1 시작도 안했었는데,어떻게 thread2에서 thread1을 interrupt 해서 결과가 true인지 궁금합니다.다시 말해서 아직 시작도 안한 스레드를 어떻게 interrupt 한걸까요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
synchronized 블록 동기화 마지막 예제
데드락 걸릴 수 있을거 같은데 맞나요?thread a: accountA.lockthread b: accountB.lockthread a : accountB.lock (대기)thread b: accountA.lock (대기)
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
SpinLock & Busy Waiting 강의 질문입니다.
안녕하세요! 강의 너무 잘 듣고 있는 수강생입니다.이전 동기화와 CPU의 관계 강의에서는 CPU가 두 개 이상의 명령어를 처리하면 원자성이 보장이 안된다고 설명을 하셨는데, SpinLock & Busy Waiting 강의에서 test_and_set(int *lock) 메서드는 CPU 하드웨어 계층에서 원자성이 보장된다는 게 이해가 잘 가지를 않습니다. test_and_set(int *lock) 이 메서드는 하나의 명령어만 처리하는 건가요??