묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
리액티브-part2
안녕하세요 강의내용과는 다른 질문인데요.part1 다음의 part2 강의도 계획중신건가요??만약 part2도 있다면 part2는 어떤 내용애 관한 강의인지 궁금하니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
예제 코드에서의 volatile 사용에 관하여 질문드립니다.
안녕하세요, 영한님.이번 강의 9분 10초쯤에 flag 와 count 변수에 volatile 키워드를 추가하셨는데,저는 flag 변수에만 volatile 키워드를 사용해도 예제 코드가 정상적으로 동작할 것으로 예상했습니다.실제로 flag 변수에만 volatile 키워드를 붙이고 실행해보니 main 스레드에서 가져온 task.count 와 work 스레드에서 가져온 count 의 값이 동일했습니다.또한 volatile 키워드를 모두 사용하지 않았을 때를 기준으로 flag 변수에만 사용했을 때 약 2배, flag 와 count 변수 모두 사용했을 때 약 5배 정도 성능이 저하되는 것을 확인했습니다.그럼에도 불구하고 count 에도 volatile 키워드를 사용하신 이유가 있을까요? 제가 생각하지 못한 예외 상황이 있을까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
LockSupport.unpark(thread) vs Interrupt
Waiting 상태의 쓰레드를 Runnable 상태로 만들기 위해선 두 가지 방법이 있다고 배웠습니다.LockSupport 기능인터럽트 발생2번 방법에 대해서 궁금한 것이 있습니다. 결과적으로 인터럽트를 발생시켜 쓰레드를 대기 상태에서 실행 가능한 상태로 전이시킨다는 것인데 인터럽트 상태가 정상(false)이 아닌 상태가 나오게 되는데 그럼 실무에서 1번 방법을 더 많이 사용하나요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
스레드 풀에 대해 질문 있습니다.
톰켓에 있는 스레드 풀도 Executor 인터페이스를 구현해서 생성하는건지 궁금합니다.스프링 부트를 사용한다면 톰켓에서 자체적으로 스레드 풀을 생성 할텐대 여기에 강의에서 배운것처럼 ExecutorService es = Executors.newFixedThreadPool(3); 이런식으로 직접 스레드 풀을 만들어서 사용해도 되는지 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
future.get()에 대해 질문 있습니다.
main 스레드에서 future.get()을 호출하면 결과값이 올때까지 다음 코드라인을 실행할 수 없는 상태가 된다고 보면 될까요?앞서 스레드들은 락 대기 집합, 스레드 대기 집합 같은 곳에서 대기를 했는데요 future.get()을 한다면 main 스레드도 대기를 할곳이 필요해 보이는데 저런 대기 집합 장소가 따로 있는지 궁금합니다.블로킹에 대한 개념을 보면서 동기/비동기, 블로킹/논블로킹에 대한 차이점에 대해 궁금해졌습니다. 구글링을 하면서 자료 조사를 했는데 여전히 헷갈리네요 혹시 간단하게 이 개념들의 차이점에 대해 설명해주실 수 있을까요
-
미해결스프링 배치
step-in-muti-thread 질문
안녕하세요 강의에서 학습하고 디버깅한 바탕으로 제 생각이 맞는지 궁금하여 질문 드립니다. 1. 4개의 스레드 풀이 존재하고 chunkSize=100, pageSize=300을 주었다고 쳤을 때 맨 처음 스레드가 데이터 베이스에서 300개를 조회2. AbstractPagingItemReader의 CopyOnWriteArrayList에 저장하고 이후 다른 스레드들은 해당 Reader를 공유하여 락 메커니즘이 적용된 doRead() 호출하여 list(count++)에서 데이터를 하나씩 가져와 개별 스택 안의 Chunk에 설정한 chunkSize 만큼 저장3. 그 후 process -> write 이렇게 작동하여 단일 스레드가 100개씩 3번 처리를 멀티 스레드를 이용해 마치 한 번 만에 300개 처리가 가능하여 속도를 향상시키는 게 맞을까요?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
오타 제보입니다.
섹션 13 - 스레드 풀과 Executor 프레임워크1강의 소스코드의 ExecutorBasicMain.java package thread.executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import static thread.executor.ExecutorUtils.*; import static util.MyLogger.log; import static util.ThreadUtils.sleep; public class ExecutorBasicMain { public static void main(String[] args) { ExecutorService es = new ThreadPoolExecutor(2, 2, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); log("== 초기 상태 =="); printState(es); es.execute(new RunnableTask("taskA")); es.execute(new RunnableTask("taskB")); es.execute(new RunnableTask("taskC")); es.execute(new RunnableTask("taskD")); log("== 작업 수행 중 =="); printState(es); sleep(3000); log("== 작업 수행 완료 =="); printState(es); es.close(); log("== showdown 완료 =="); printState(es); } } 다른곳들은 다 고쳐져있는 거 같은데, 이 클래스에만 showdown으로 아직 변경이 안되어있습니다.
-
해결됨MFC Windows 프로그래밍 - 응용
수업자료
수업자료가 외워서 끝내는 네트워크 핵심이론인데, 맞나요?
-
해결됨MFC Windows 프로그래밍 - 응용
수업자료
수업자료가 '외워서 끝내는 네트워크 핵심이론-응용'인데 이거 맞나요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
break 부분이 왜 필요한지 헷갈립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기서 catch 부분에 break가 왜 필요한건가요?"q" 를 입력하면 printerThread 에 인터럽트를 걸고 while문의 !Thread.interrupted가 false가 되어서 while문을 탈출하는게 아닌가요?아니면 !Thread.interrupted가 false가 되기 전에 먼저 예외를 잡아서 인터럽트가 true에서 false로 먼저 되어서 !Thread.interrupted가 true가 되는건가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
compareAndSet()에 대해 질문 있습니다.
private static int incrementAndGet(AtomicInteger atomicInteger) { int getValue; boolean result; do { getValue = atomicInteger.get(); log("getValue: " + getValue); result = atomicInteger.compareAndSet(getValue, getValue + 1); log("result: " + result); } while (!result); return getValue + 1; }getValue = atomicInteger.get(); 에서 조회한 값이 compareAndSet() 연산을 할때 바뀌지 않아야 바꿀려고 한 값으로 바꾸고 true를 반환한다고 이해했습니다.궁금한 부분은 getValue = atomicInteger.get(); 여기서 값을 조회하거나 중간에 스레드가 바꾼 값을 조회 한다는걸 compareAndSet()에서 구분을 할 수 있나요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
CPU와 스레드간 상호작용에 대해 질문 있습니다.
CPU 코어와 메모리가 동작하는 이미지가 자주 나왔는데요헷갈리는 부분이 있어서 질문 합니다.스레드, 프로세스, 메모리 등 여러 개념들이 존재하지만 CPU와 직접적으로 통신(?) 하는 주체는 스레드라고 이해를 해도 될까요?1번이 맞다면 스레드는 본인이 실행한 코드 한줄 한줄을 CPU로 보내고 CPU는 해당 코드 한줄을 해석하고 그에 따라서 프로세스에 할당된 메모리 영역(힙, 데이터, 코드)이나 스레드에 할당된 메모리 영역(스택)에 접근해서 데이터를 읽거나 저장한다 라고 이해를 해도 될까요?Java의 thread는 OS의 kernel thread와 1:1로 mapping 되는걸로 알고 있는데 그러면 CPU는 kernel thread와 통신 한다고 이해하면 될까요?
-
해결됨MFC Windows 프로그래밍 - 응용
자료 다운로드 관련
안녕하세요 섹션1 (알고 있어야 하는 것들)에서 자료 다운로드가 안되는데 저만 그런건가요?? 확인 부탁 드립니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Synchronized 락 순서 획득질문
"어떤 순서로 락을 획득하는지는 자바 표준에 정의되어 있지 않다. 따라서 순서를 보장하지 않고, 환경에 따라서 순서가 달라질 수 있다." 라고 설명하셨는데 OS에서 프로세스 스케줄링에 영향을 받지 않는건가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
ReentrantLock과 sleep()에 대해 질문 있습니다.
ReentrantLock 사용시 쓸 수 있는 락이 여러 개 있는지 아니면 하나만 쓸 수 있는지 궁금합니다.Object의 wait() 사용 시 스레드가 스레드 대기 공간에서 기다리는 것처럼 sleep() 같은 경우도 따로 대기하는 공간이 있는지 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
ReentrantLock 과 Condition 에 대해 질문 있습니다.
public class BoundedQueueV4 implements BoundedQueue { private final Lock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); private final Queue<String> queue = new ArrayDeque<>(); private final int max; public BoundedQueueV4(int max) { this.max = max; } @Override public void put(String data) { lock.lock(); try { while (queue.size() == max) { log("[put] 큐가 가득 참, 생산자 대기"); try { condition.await(); log("[put] 생산자 깨어남"); } catch (InterruptedException e) { throw new RuntimeException(e); } } queue.offer(data); log("[put] 생산자 데이터 저장, notify() 호출"); condition.signal(); } finally { lock.unlock(); } } @Override public String take() { lock.lock(); try { while (queue.isEmpty()) { log("[take] 큐에 데이터가 없음, 소비자 대기"); try { condition.await(); log("[take] 소비자 깨어남"); } catch (InterruptedException e) { throw new RuntimeException(e); } } String data = queue.poll(); log("[take] 소비자 데이터 획득, notify() 호출"); condition.signal(); return data; } finally { lock.unlock(); } } @Override public String toString() { return queue.toString(); } }synchronized를 사용 했을때는 객체가 기본적으로 가지고 있는 락과 스레드 대기 공간을 사용하는거 같습니다. 궁금한점은 ReentrantLock 객체를 생성하고 Condition 객체를 생성하면 BoundedQueueV4 내부에 또 다른 락과 스레드 대기 공간이 생성 되는건가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
notify() 호출 후의 상황에 대해 질문 있습니다.
@Override public synchronized void put(String data) { while (queue.size() == max) { log("[put] 큐가 가득 참, 생산자 대기"); try { wait(); // RUNNABLE -> WAITING, 락 반납 log("[put] 생산자 깨어남"); } catch (InterruptedException e) { throw new RuntimeException(e); } } queue.offer(data); log("[put] 생산자 데이터 저장, notify() 호출"); notify(); // 대기 스레드, WAIT -> BLOCKED }생산자 스레드가 먼저 실행되면 마지막 스레드는 wait() 호출 후 스레드 대기 집합에서 관리 되는걸로 이해했습니다.이 상태에서 소비자 스레드가 실행되면 데이터를 처리하고 마지막에 notify()를 호출하면 스레드 대기 집합에서 관리 되던 생산자 스레드가 깨어날텐대 여기서 wait(); 바로 다음 코드를 실행하지 않고 바로 BLOCKED 상태가 되는건가요?BLOCKED 상태에 있다가 소비자 스레드가 락을 반납 했을때 BLOCKED 상태가 풀리면서 wait() 바로 다음 코드를 실행한다고 이해하면 될까요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
문자열 풀 값을 이용한 String 변수
강의에서 각 스레드 스택 마다 지역변수로 objectReference 참조 변수를 생성하시는 것을 예시로 들어주셧는데요, 해당 변수는 문자열 풀 값들을 이용해서 만들어진 것이잖아요.힙에 저장될 때 어떻게 데이터가 저장되나요? thread 1번에서 생성한 지역변수인 objectReference 는"1" 의 문자열 풀 주소값 + ": Hello World" 의 문자열 풀 주소값, thread 2번에서 생성한 지역변수인 objectReference 는"2" 의 문자열 풀 주소값 + ": Hello World" 의 문자열 풀 주소값,...이렇게 저장되는 것이 맞을까요?? 혹은 "1 : Hello World" 라는 문자열 전체가 하나의 스트링 풀에 저장되고, 그 상수에 대한 주소값이 저장되는 것일까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
synchronized 코드블록에서 사용하는 파라미터의 존재 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]synchronized (){} 블록에서 파라미터로 인스턴스를 지정하는 이유가 혹시 다른 클래스에 있는 메서드와의 동시성 연결..? 때문일까요?예를 들어 이러한 사고 실험을 해보았습니다)A 클래스에 a 메서드를 실행하면 해당 메서드에서 내부적으로B 클래스에 b 메서드를 실행한다고 가정을 하겠습니다. 하지만 b 메서드는 a 메서드를 통해서만 호출되는 것이 아니라 자체적으로도 호출하는 메서드라고 했을 때, 나타나는 동시성을 고려한 것일까 의문이 들었습니다. 그렇다고 한다면,b 메서드 안에 synchronized (b 클래스의 인스턴스) {} 를 지정하여,a 메서드를 통해 호출되는 b 메서드와 B 클래스 자체적으로 호출하는 b 메서드의 동시성 문제를 해결할 수 있겠다 예상이 됩니다. synchronized 블록의 파라미터는 위와 같은 상황을 위해 특정 인스턴스의 락을 파라미터로 잡게 한건가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Thread.yield() 는 컨텍스트 스위칭을 일으키는 걸까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서 ,Cache 메모리 값을 초기화하는데 제일 확실한 방법이 컨텍스트 스위칭이라고 하셨습니다.그럼 while 문 안에 Thread.yield()를 통해 Running 에서 Ready로 바꾸면 되지 않을까? 생각이들어 직접해보니 바로 꺼지는 것을 확인했습니다. 여기서 의문이 들었습니다. Thread.yield()를 하게되면 컨텍스트 스위칭을 하는 걸까요?