묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
동적 의존성 주입과 Volatile
[질문]2024.08.07 까지는 정액할인, 2024.08.08 부터는 비율할인 정책이 반영되어야 하는 비즈니스 로직이 있고, 이를 스케줄러를 활용하여 2024.08.08 00:00:00에 Setter를 활용하여 비율할인을 구현한 Bean을 Injection 하여 처리하도록 구현했다고 가정하면, 이런 경우에도 아주 아주 엄밀하게 00:00:00에 모든 할인 정책이 완벽히 적용되어야 한다면, 인스턴스 변수에 volatile을 반드시 명시해줘야 하는 것인가요? 경험이 미천하여 웹프로그래밍 할 때 volatile를 사용한 것을 거의 보지 못하였고, 위의 가정처럼 아주 엄밀한 동작을 요구하는 경우는 없었고 그간 별다른 일도 없긴 하였는데, 개념을 듣고 복기해보니 장애의 요인이 될 수 있을 것 같아 여쭙습니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
6. synchronized 문제 1 log출력
public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); Runnable task = new Runnable() { @Override public void run() { for (int i = 0; i < 10000; i++) { counter.increment(); log(counter.getCount()); // 로그 출력 추가!!!!!!!!!!!!!!! } } }; Thread thread1 = new Thread(task); Thread thread2 = new Thread(task); thread1.start(); thread2.start(); thread1.join(); thread2.join(); log(counter.getCount()); } static class Counter { private int count; public void increment() { count++; } public int getCount() { return count; } } 문제를 푸는 도중 count의 값을 확인해보고 싶어서 MyLogger.log(counter.getCount());를 호출했더니 문제 없이 20000이 계속 출력됩니다.synchronized를 사용하지 않아서 여전히 동시성 문제는 발생할텐데 어떻게 20000이라는 값이 나오게 되는지 궁금합니다!!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Runnable 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]https://javatrainingschool.com/multithreading/thread-lifecycle/위 링크에서는 Runnable과 Running 상태를 분리하는데 혹시 두개의 차이가 있나요?
-
해결됨자바 동시성 프로그래밍 [리액티브 프로그래밍 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번부터 생성됨을 확인할 수 있습니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
스레드 대기 집합 질문
여기에서 스래드 대기 집합은 WAITING, TIMED_WAITING, BLOCKED가 보관되는 곳과는 다른 큐를 의미하는게 맞을까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Blocked 되지 않는 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]쓰레드의 동시성이슈를 syncronized로 해결하였을때로그를 보면, 00:53:11.012 [ t1] 거래 시작: BankAccountV300:53:11.012 [ t2] 거래 시작: BankAccountV300:53:11.020 [ t1] [검증 시작] 출금액: 800, 잔액: 100000:53:11.021 [ t1] [검증 완료] 출금액:800, 잔액: 100000:53:11.489 [ main] t1 state: TIMED_WAITING00:53:11.490 [ main] t2 state: TIMED_WAITING00:53:12.021 [ t1] [출금 완료] 출금액:800, 잔액: 20000:53:12.021 [ t1] 거래 종료00:53:12.021 [ t2] [검증 시작] 출금액: 800, 잔액: 20000:53:12.022 [ t2] [검증 실패]00:53:12.024 [ main] 최종 잔액: 200이런식으로 t1, t2 두 쓰레드중 하나가 blocked 되는 것이 아니라 모두 time_waiting상태로 유지 됩니다.뭔가 느낌으로는 큰 상관은 없을 것 같고, 시스템 환경에 따른 차이인 거 같은데, 혹시나 제가 세팅을 잘못했거나 코드를 잘못 짰을 가능성도 있을까요.## 메인 클래스를 반복해서 실행해보니t1, t2 스레드 모두 time waiting 상태이거나 모두 blocked 상태가 됩니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
원자적 연산을 확실히 알수 있는 방법이 있나요?
i++ 은 1줄이지만 , 2~3개의 cpu 연산이 필요하므로 원자적 연산이 아닙니다.cas 도 상식적으로는 2개 이상의 cpu 연산이 필요한데 cpu 차원에서 1개의 cpu 연산처럼 제공해주기에, 원자적 연산이라고 보는것 같습니다.아래와 같은 경우 원자적연산인데,int count = 3; 그렇다면 아래의 코드는 원자적연산인가? 생각해보면, max 값을 가져오고 그걸 대입해야 하므로 2개 이상 cpu 연산이 필요한것 같은데 확신은 들지 않습니다.int count = max; --그래서... 어디까지가 원자적 연산인지 확실히 알수 있는 방법이나 이와 관련된 스펙문서 등이 있는지 궁금합니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
synchronized가 붙은 메소드를 정말 동시에 접근하는 경우
[질문 내용]안녕하세요. 항상 좋은 강의 감사드리며 질문이 하나 있습니다. 멀티 코어라는 가정하에, synchronized가 붙은 메소드를 정말 동시에 호출하는 경우에는 어떤 스레드가 Lock을 가져가는지 궁금합니다. 정말 동시에 호출되면 두 스레드 모두 Lock을 획득할 수 있는지 조회할 때 획득할 수 있다고 조회가 될 것 같아서요.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
BankAccountV5 lock.unlock() 작성 여부
BankAccountV5에서 lock.tryLoc()을 사용하는 경우, lock을 얻지 못하면 WAITING하지 않고 바로 return false;하므로 finally { lock.unlock(); }라는 코드가 필요 없을 것이라 생각했는데 이 코드가 꼭 필요한 코드인가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
jvm 구현에 따라 vs java 버전과 구현에 따라
notify / signal 차이점 설명하시면서1) java 버전과 구현에 따라 다르다.2) jvm 구현에 따라 다르다.라고 말씀하시는데, 이 둘간의 정확한 차이가 뭔지 궁금합니다. 제 지식으로는 아래 정도로 보이는데,1) java 라이브러리단에서 구현된 방식(=디컴파일을 통해 내부 로직을 알수있음, 컴파일러 버전에 영향)vs2) jvm 내부에 구현된 방식(=디컴파일해서는 내부 로직 알수없음, 컴파일러가 아닌 런타임에 사용된 java 버전에 영향)로 보면 되는가요? 1) java 구현: 컴파일시 사용된 java 구현체( .java -> .class 변환)2) jvm 구현 : 런타임에 사용되는 jvm 구현체?(.class 구동)
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
오타 제보합니다
Executor 스레드 풀 관리 - 분석 강의에서 정리 - Executor 스레드 풀 관리부분에서 4번 큐도 가득차고, 풀에 최대 생성 가능한 스레드 수도 가득 찼다. 부분을 강의하시다가 '에'를 큐 앞으로 당겨버리셨어여 그래서 에 큐도 가득차고, 풀최대 생성으로 바뀌었습니다
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
오타 제보합니다 ^^
첫번째 PPT 프로세스와 스레드 소개의 3 페이지에 오타가 있어 제보합니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
시분할은 Time Slicing이 아닌가요?
PPT에는 시분할이 Time Sharing이라고 표기되어있는데, '분할'이라는 표현에 'Sharing'이 붙어 뭔가 이상해 검색해보니 Time Slicing이라는 표현이 따로 있는 것 같더라고요. 다른 의도가 있어서 Time Slicing이라고 하신건가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
CAS 와 동기화락 질문 있습니다!
안녕하세요. 영한님 강의 재밌게 잘 보고 있습니다. 몇 가지 궁금한 점이 있습니다 CAS가 버전을 사용하는 Optimistic lock의 개념이고 동기화 락이 Pessimistic lock 방식의 개념이라고 생각해도 될까요??2대 이상의 서버에 로드밸런싱이 적용 된 실제 운영 환경에서도 해당 방식들이 흔히 쓰이는지 궁금합니다~
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
강의소개 질문
안녕하세요. 여기 강의소개 보고 CS 이론이라고 되어 있는데학교에서 배우는 CS theory 랑 같은 맥락의 CS 이론인건가요 ?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
멀티스레드 app 질문
안녕하세요.스레드 강의를 듣던 중에 만들고 싶은 프로그램이 생겨서 질문 드립니다.스크랩 데몬 프로그램을 만들려고 하는데DB에서 url 리스트를 조회하고리스트를 스레드 갯수만큼 분할한 뒤멀티 스레드를 활용해서 각 스레드에서 스크랩을 하고 DB에 저장 한 뒤 잠시 sleep위를 무한 반복하는 역할을 합니다.lombok, logging, dev, prod.yml config 등 springboot의 편리함을 사용하고 싶고gradle을 활용하여 멀티 모듈로 작성할 계획인데(DAC: JPA를 사용하는 역할은 따로 분리, infra mailling 등 분리)spring-boot-starter만 web 없이 사용해서 구현하려고 했더니 마땅히 작성할 위치가 보이지 않아 일단 ApplicationRunner를 구현하고 작성하였는데 문제는 build 시에 ApplicationRunner를 springboot가 실행하여서 무한 반복에 빠져서 빌드가 완료가 안됩니다.이를 환경변 수 등을 이용해서 피할 수는 있겠으나이러다보니 springboot에 작성하는게 잘못된건가 싶기도하고 그냥 쌩 자바 프로그램으로 하는게 맞을까요?선생님이시라면 어떻게 구현을 하실지 의견 부탁드립니다.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
CPU 코어 개수와 Worker Thread 개수 설정 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]CPU Bound task가 주를 이룬다고 가정하더라도, 코어수 = Thread 수로 설정하는 것이 의미가 있는지 궁금합니다.[상세]nginx나 webflux 같은 논블럭킹 IO를 사용하는 경우, 영한님께서 강의에서 말씀해주셨듯이 worker thread 수를 core 수에 맞추라고 가이드를 주고 있는데,저는 항상 궁금한 점이 서버에 프로세스가 nginx나 웹 애플리케이션만 있는 것이 아닌데, 저런 설정이 정말 의미가 있을까 하는 점이었습니다.다수의 프로세스가 병렬로 처리되고 있으면, 설령 worker thread 수 = core 수로 설정하더라도 다른 프로세스가 core를 점유할테니 core를 점유하기 위해 기다리는 worker thread가 분명히 있을 것 같다는 생각이 들었기 때문입니다.제가 생각한 부분에 오류가 있는 것일까요? 아니면 가이드에서 그런 환경까지는 생각하지 않고 idle한 제안을 해준 것 뿐일까요?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
join() 시 CPU 점유 여부
join()시에 스레드는 CPU를 점유한 상태에서 대기하는 건가요? 아니면 스레드 큐에 들어가있나요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
람다식과 스트림에 대해서는 강의가 없을까요!
궁금합니다!
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
언체크 예외를 던질 때
자바 오버라이딩 규칙 중에서 부모보다 같거나 적은 개수의 예외를 던져야 한다고 알고 있습니다. 그런데, Runnable 구현 클래스의 run()에 'throws RuntimeException'을 선언하면 컴파일 오류가 발생하지 않는데 왜 그런건가요? 부모보다 많은 개수의 예외를 던졌으니 컴파일 오류가 발생해야 하는 것 아닌가요..?제가 무엇을 잘못 알고 있는 걸까요?