묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
new Condition 부분 질문
선생님 안녕하세요. 이해가 안되는 부분이 있습니다.대기 메서드가 호출되면 락이 해제되고,=> 대기 메서드가 호출 되면 락이 해제되는 것까지는 이해했습니다.신호 메서드(notify)가 호출되어 대기 메서드에서 반환하기 전에 스레드는 락을 다시 획득한다.=> 이부분이 잘 이해되지 않는데요. 대기 메서드가 호출되면서 락이 해제, 와 동시에 신호 메서드가 호출되어 대기가 다 끝나기전에 (wait) 락을 다시 획득한다는 말인가요? 즉, public wait () { 1. 락 해제 2. 신호 메서드 호출 (notify all) 3. Thread.currentThread -> 락 획득??}답변 부탁드립니다!감사합니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
13:00 강의 내용 이해 질문
즉, 메인스레드가 하나의 스레드가 아닌 여러개 스레드 각 스레드마다 조인을 걸 수 있겠죠. 조인을 겁니다. 각스레드의 작업이 끝나게될때까지 메인 스레드는 계속 대기하게되겠죠 각 스레드가 작업이 종료되면 그 때 메인 스레드는 대기에서 빠져나오지만 나머지 스레드가 다시 모든 작업이 종료될 때 까지는 대기해야되겠죠?라고 하시면서 실행을 재개하는 흐름을 반복한다. 라는 4번 내용을 읽었습니다. 즉, 저 설명 내용이 각 스레드가 join 이 걸려서 join 이 걸린 스레드들이 작업이 종료되면 그 때 메인스레드는 대기 즉, wait 상태에서 나오고 runnable 상태가 되는거라고 이해했습니다.그런데 다음 설명에서스레드는 대기에서 빠져나오지만 나머지 스레드가 다시 모든 작업이 종료될 때 까지는 대기해야되겠죠? 라는 설명이 이해가 잘 안가는데요각 스레드가 종료됨에따라 메인스레드가 대기에서 빠져 runnable 상태가 되지만... 나머지 스레가 다시 모든 작업이 종료될때까지 대기????? ...이미 메인을 제외한 모든 스레드들이 작업이 끝났는데 어떻게 또 종료될때까지 대기하는거죠? 이전 강의에서 한번 사용한 스레드는 재사용이 불가능하다고 하셨습니다
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
강의 출시 질문 있습니다.
우선 좋은 강의 만들어 주셔서 정말 감사드립니다 :)얼마전에 스프링 MVC 관련 강의를 출시 해주셨는데요. 구입하고 한번 내용 확인해보니 앞으로 강의 출시 FLOW 를 설명 해주신 내용이 있었습니다. 동시성 파트 부분인 '리엑티브 프로그래밍' -> 'WebFlux' 강의 도 있는데요. 다음 강의 출시 할때 이 부분 부터 강의 출시 해주시는 건지 알고 싶습니다. (사실 '동시성 프로그래밍' 강의 이후 '리엑티브 프로그래밍' -> 'WebFlux' 강의를 손꼽아 기다리고 있었거든요 ㅠ,ㅠ)
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
InterruptedExceptionThreadStopExample 질문입니다.
InterruptedExceptionThreadStopExample 를 돌리면 강의 로그에서는============= 중단 스레드가 작업 스레드를 중단 시켰습니다.인트럽트 상태 1 : true=============형태가 찍히는데 제 로컬에서는=============중단 스레드가 작업 스레드를 중단시켰습니다.인트럽트 상태 2 : false=============가 찍히는데 이건 확률적으로 로그가 찍히는 걸까요? 답변 부탁 드립니다!
-
해결됨자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
instance.getMyField()의 값이 왜 다른가요?
AtomicIntegerFieldUpdater 기본 구현 페이지의 코드에서마지막 System.out.println() 부분을 보면은 new value라고 하고 instance.getMyFiled()를 하고Updated value에도 instance.getMyFiled()를 합니다그런데 옆에 주석에 new value는 42, updated value는 43으로 나오는데 실제로 실행해보니 저는 둘 다 43으로 나오더라구요 표기 오류가 맞는거겠죠?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
해당 강의 내용 무단 도용 신고
ReentrantReadWriteLock.wirteLock() 설명 중[읽기 락은 쓰기 락과 독립적으로 소유되므로 영향을 주지 않지만 현재 스레드가 읽기 락도 획득한 상태에서 조건 대기 메서드를 호출하는 것은 사실상 항상 오류이다. 왜냐하면 대기를 해제할 수 있는 다른 스레드도 쓰기 락을 획득하지 못할 수 있기 때문이다.]와 같은 설명이 readLock( ).lock( )을 실행한 상태에서, newCondition( )의 메서드를 사용하면 오류가 발생하는 것인지 궁금하여 구글링을 하던 중 아래와 같은 사이트를 발견하였습니다. https://jaimemin.tistory.com/2411블로그에 들어가보면, 강사님의 자료를 수정없이 모든 내용을 예제까지 포함하여 작성되어 있고, 또한 광고를 붙여 수익을 얻고 있는 것으로 확인되었습니다. 엄연히 지적재산권이 있는 유료 강의를 타인이 무단 도용하여 수익을 창출하고 있는 행태는 도의적으로 아니지 않나 생각이 들어 알려봅니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
Thread Waiting 상태 관련 질문 드립니다.
Thread 가 Wating 상태로 변경될 때 java 에서 Object.wait() 혹은 Thread.join() 을 호출 한다고 스레드 생명주기와 상태 - 21:51에서 말씀 주셨는데 래퍼런스를 확인해보니 wait(), join() 이외에 LockSupport.park ()라는 동작도 있다고 적혀있습니다. 해당 동작은 어느시점에 이루어지는지 언제까지 대기상태를 유지하는지 궁금합니다 🙂
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
단일연산변수 api
안녕하세요단일연산변수 api에 관련해서 질문드립니다!13:50 ppt에서 단일연산변수를 사용한(왼쪽) 코드에서for문에서counter.incrementAndGet()을 호출하는부분이 있는데해당 메서드 실패시 재연산을 수행하는 코드가 없더라고요그래서 해당 api는 내부적으로 cas연산을 사용하는데내부적으로 cas연산이 실패하는경우 재시도를 통해서최종적으로 나오는 결과값을 무조건 보장해주는걸로 이해했는데 맞는걸까요??
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
synchronized 블럭과 메인메모리 반영
안녕하세요 선생님 강의 재밌게 듣고 있습니다!24:27분 ppt에서synchronized 블럭안에서 참조되는 모든 변수들은 메모리로부터 읽어들여지고 블럭을 벗어나면 그동안 수정된 모든 변수들이 즉시 메모리로 반영하게 해준다고 설명해주셨는데왜 연산이 수행되고나서 바로 적용이 되는게 아닌 블럭을 벗어나야지 적용이 되는건가요??내부적으로 성능최척화를 위해서 그런건가요??이렇게 블럭을 벗어나고 적용이되는경우로 인해생기는 다른 문제점은 없나요??(블럭에서 연산 시간이 오래 걸려 가시성이 늦어지는 등)
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
실무에서 자바가 제공하는 락을 사용하는 경우
자바에서 제공하는 동기화 도구들(synchronized, ReentrantLock 등)은 단일 JVM 내에서만 동기화를 보장하고, 여러 인스턴스가 있는 분산환경에서는 분산락 등 다른 기법을 사용해야 하는 것으로 알고있습니다.현대의 운영 환경에서는 고가용성과 확장성을 위해 대부분 여러 인스턴스를 운영하기 때문에, 자바 자체의 동기화 기법을 사용하는 경우가 제한적일 것 같은데요. 실무에서 자바가 제공하는 동기화 도구들은 어떤 경우에 주로 활용되나요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
뮤텍스나 세마포어는 busy waiting이 없는 게 맞을까요?
강의자료에서 세마포의 경우 P연산에서첫째줄에 while(test_and_set(&lock)==1)을 수행하고 있는데요, 혹시 이부분은 busy waiting으로 생각하지 않는 건가요? 뮤텍스나 세마포어 모두 강의자료에서 위 코드를 처음 실행하는데 이부분도 busy waiting에서 while(); 문과 동일하지 않나 생각이 들어서요 혹시 제가 잘못 이해하고 있는 것이라면 알려주시면 감사하겠습니다!
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 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번부터 생성됨을 확인할 수 있습니다.