본문 바로가기

자바스레드3

java.util.concurrent 안에는 뭐가 들었을까 이전 블로그 포스팅에서 동시성 제어의 원초적 접근법으로 synchronized 가 유효한지 살펴보았습니다. 이 후, java.util.concurrent 패키지에서 synchronized 의 단점을 보완할 수 있는 방법을 찾게되었습니다.synchronized 에 치명적 단점은 두 가지가 있습니다. synchronized 키워드로 이루어진 영역에 스레드가 접근하려면 모니터 락을 획득해야합니다. 스레드는 모니터 락을 획득할 때까지 무한 대기합니다. 이때 해당 스레드의 상태는 BLOCKED 입니다. BLOCKED 상태는 interrupted() 로도 다시 RUNNABLE 상태로 전이시킬 수 없습니다. 락을 얻기 전까지는 계속 BLOCKED 상태로 머무릅니다. 그래서 '무한' 대기 상태에 빠지게됩니다. 심지어 .. 2025. 1. 4.
join() 이용해보려다가 실패한 사연 쓰레드는 상태를 가진다. 쓰레드가 가질 수 있는 상태는 다음과 같다.    위 상태들을 쭉 보다가 TIMED_WAITING 와 WAITING 은 어떻게 다른지 궁금해졌다. 언제 전이되는지, 어떤 상태에서 전이될 수 있는지를 직접 실험해보았다. 그리고 팀에서 관리하는 서비스에서 적용할 만한 사례를 찾아보았다. 천천히 스텝 바이 스텝으로 나아가기로했다. TIMED_WAITING 과 WAITING 상태인 스레드를 직접 눈으로 확인해보는 것이 시작이었다.   다음 코드에서 TIMED_WAITING 으로 전이될 수 있는 포인트가 있다. Thread.sleep(3000) 이다. sleep() 은 스레드를 잠시 멈추게 한다.실행을 일시 중단했다가 얼마의 시간이 지난 후 다시 재실행한다. 이 과정에서 스레드의 상태는.. 2024. 11. 28.
메인 스레드, 커스텀 스레드, 데몬 스레드 테스트 찍먹일기 : multiThread & concurrency 2 Thread main 은 언제 만들어진걸까? 프로세스가 실행되려면 최소한 하나의 스레드는 존재해야한다고 이전 포스팅에서 설명했다. 왜냐면 정말 일을 doing 하는 건 스레드이기 때문이다. 자바에서는 실행시점에 main 스레드가 만들어지도록 설계되었고 main 스레드가 main() 메서드를 실행한다. 이걸 주관하는 건 JVM이다.그럼 또 다른 스레드 Thread-0 은 어디서 튀어나온 애일까? TwiceThread 같은 사용자 정의 스레드를 생성하고 start() 메서드를 호출하면, JVM은 새로운 스레드를 생성한다. 그리고 스레드 생성 차례에 맞게 Thread-0, Thread-1 같은 순서로 이름붙인다. 그래서 Thread-0 이 응애하고 출력된 것.사진을 보면 start() 를 호출했는데 내부적으로.. 2024. 10. 9.