https://c-king.tistory.com/620
Pinning 문제
아래 상황에서는 virtual thread가 carrier thread에 고정(pinned)돼서, 사실상 일반 스레드처럼 동작해버릴 수 있다.
- synchronized 블록/메서드 안에서 blocking
synchronized (lock) {
// 여기서 I/O, sleep, monitor enter 등 블로킹
socket.read(); // 가령 이런 식
}
이런 경우:
- synchronized 모니터를 잡은 상태에서 blocking이 발생하면
- 그 virtual thread는 carrier thread와 같이 묶인다(pinning)
- 이 동안 carrier thread가 다른 virtual thread를 실행하지 못하고, 스레드 풀 효율이 떨어진다.
- Native / JNI 호출, 블로킹 OS 호출
virtual thread가 JVM 밖의 native 코드(JNI, 외부 라이브러리)를 호출할 때:
- 해당 호출이 블로킹 I/O라면
- JVM은 그걸 cooperative하게 park/unpark 할 방법이 없고
- 결국 carrier thread가 그대로 묶인다.
ThreadLocal 남용