Replies: 1 comment
|
오 저도 궁금했던 점이고 클로드랑 같이 대화했던 내용이랑 비슷하네요 ㅎㅎ |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
자바 동기화 메커니즘 Q&A
Q1. 자바에서
synchronized키워드가 사용하는 락의 정체가 무엇이야?A1.
synchronized는 자바 객체(Object)에 내장된 모니터 락(Monitor Lock)을 사용함. 모든 객체는 이 모니터 락을 가지고 있으며,synchronized메서드나 블록에 접근할 때 이 락을 획득하고 해제함Q2.
LockSupport.park()는 모니터 락을 사용하지 않는다면, 어떤 메커니즘으로 스레드를 제어하는거야?A2.
LockSupport.park()는 모니터 락과는 완전히 독립적인 퍼밋(Permit)이라는 저수준(Low-level) 메커니즘을 사용함. 퍼밋은 스레드별로 관리되는 단 하나의 허가증(0 또는 1) 같은 것임Q3.
LockSupport.park()는 스레드를 언제WAITING상태로 만드는 거야?A3.
park()는 호출 시 스레드가 퍼밋(Permit)을 가지고 있는지 확인함WAITING상태로 전환되어 CPU를 사용하지 않고 대기함park()는 즉시 반환되며, 스레드는 대기하지 않고 계속 실행됨 (이 퍼밋은 이전의unpark()호출로 인해 미리 주어진 것)Q4.
LockSupport.unpark(Thread t)의 역할은 무엇이며, 퍼밋과 어떻게 연관되나요?A4.
unpark(Thread t)는 대상 스레드에게 퍼밋을 제공하여 대기 상태에서 벗어나도록 신호를 주는 역할을 함WAITING에서RUNNABLE상태로 깨우고, 퍼밋을 다시 0으로 초기화함park()를 호출하면 즉시 통과하게 됨(0으로 초기화)Q5.
LockSupport의 퍼밋이 모니터 락을 사용하는Object.wait()보다 좋은점은?A5.
LockSupport는 선행unpark()가 가능하다는 점이 가장 큰 장점Object.wait()는 반드시wait()가 호출된 후에notify()가 호출되어야 스레드를 깨울 수 있음LockSupport는unpark()가 먼저 호출되어도 퍼밋을 남겨두기 때문에, 스레드가 나중에park()를 호출해도 즉시 통과할 수 있음LockSupport의 퍼밋(Permit) 개념과 구현 원리
1. 퍼밋의 개념: 단일 이진(Binary) 상태
2. 구현 원리: JVM의 저수준 관리
1) JVM 및 OS 연동
LockSupport의 실제 작동은 JVM이 스레드 객체 내부에 숨겨진 필드를 사용하거나, OS에서 제공하는 뮤텍스(Mutex)나 세마포어(Semaphore) 같은 저수준 동기화 기본 요소를 호출하여 구현됨
2) 선행 호출 (Pre-Acquisition)의 구현
unpark()가 park()보다 먼저 호출될 때 퍼밋을 1로 설정하여 나중에 park()가 즉시 통과하게 만드는 메커니즘은, synchronized의 wait/notify와 달리 "Lost Wakeup"을 방지하는 핵심임
예시: 스레드 A가 unpark()를 호출하면, JVM은 A 스레드의 숨겨진 퍼밋 상태를 1로 설정. 나중에 A 스레드가 park()를 호출하면, JVM은 퍼밋(1)을 확인하고 0으로 초기화한 뒤 즉시 park() 호출을 통과시킴
한줄로 정리해보자면?
추가 synchronized와 LockSupport 메커니즘의 차이점 요약
BLOCKEDWAITING또는TIMED_WAITINGsynchronized블록 종료 시 JVM이 자동 해제unpark()또는interrupt()호출로 개발자가 수동 해제ReentrantLock,Semaphore등 고급 동기화 도구의 내부 구현All reactions