티스토리 뷰
반응형
Java 21 에서는, virtual threads (introduced in Project Loom) 를 완벽하게 지원하므로 "synchronized" 와 같은 기존 동시성 기본 요소를 사용하면 애플리케이션의 성능과 확장성에 부정적인 영향을 미칠 수 있습니다. "synchronized" 가 virtual threads와 어떻게 충돌할 수 있는지는 다음과 같습니다.
1. Synchronized Blocks은 플랫폼 스레드에 연결
- How It Works:
- "synchronized" 는 platform threads (i.e., OS threads)에 연결된 내장 잠금(intrinsic lock)에 의존한다.
- "synchronized" 블록이 입력되면 스레드가 Lock을 획득하고 동일한 블록에 진입하려는 다른 스레드는 OS 수준에서 차단됩니다.
- Impact on Virtual Threads:
- 가상스레드는 가볍고 수백만 개의 스레드로 확장되도록 설계되었습니다. 그러나 "synchronized"를 사용하면 lock을 기다리는 동안 가상스레드가 OS 스레드 수준에서 차단됩니다.
- 가상스레드는 제한된 수의 플랫폼 스레드를 공유하므로 플랫폼 스레드를 차단하면 가상 스레드의 동시성 이점이 줄어듭니다.
2. Blocking 으로 인해 확장성이 저하됨
- Why Blocking Matters:
- 가상 스레드는 대기 시(e.g., on I/O or locks) 자체를 parking하고 기본 플랫폼 스레드를 해제하여 높은 동시성을 달성합니다.
- "synchronized"는 이 동작을 허용하지 않습니다. synchronized lock에서 차단된 가상 스레드는 플랫폼 스레드를 묶어 다른 가상 스레드에 대한 스레드의 가용성을 줄입니다.
- Result:
- 플랫폼 스레드의 활용도가 낮습니다.
- 대량의 도시 가상 스레드를 처리하는 애플리케이션의 확장성이 감소합니다.
3. synchronized의 제한된 유연성
- No Fairness or Timeout Mechanisms:
- Intrinsic locks (used by synchronized)에는 동시성 높은 환경에서 경합을 제어하는 데 중요한 공정성 또는 timeout과 같은 기능이 없습니다.
- Impact on Virtual Threads:
- 동기화 lock에 대한 경합이 높은 Applications은 특히 가상 스레드가 많은 환경에서 스레드 부족 또는 교착상태를 경험할 수 있습니다.
4. Alternatives Are More Virtual-Thread-Friendly
- 최신 Java는 가상 스레드와 잘 작동하는 더 나은 동시성 도구를 제공합니다.
- ReentrantLock:
- 가상스레드는 ReentrantLock을 기다리는 동안 스스로 parking되어 다른 작업을 위해 플랫폼 스레드를 확보할 수 있습니다.
- Structured Concurrency (introduced with Project Loom):
- lifecycle을 조정해 가상 스레드를 보다 효과적으로 관리하는 데 도움이 됩니다.
- Staged Event-Driven Architecture (SEDA):
- 작업이 명시적인 작업 대기열을 통해 여러 단계로 나누어 경합을 방지하는 디자인 패턴을 권장합니다.
- ReentrantLock:
- Impact:
- 가상 스레드 친화적인 도구를 사용하면 '동기화'를 사용할 때보다 애플리케이션이 더 높은 동시성과 확장성을 달성할 수 있습니다.
5. Impact on Debugging and Profiling
- 혼합 스레드 모델의 문제점
- "synchronized"를 사용하는 경우 가상 스레드의 경우 스레드 볼륨과 경합 핫스팟이 많아 스레드 경합 진단이 더욱 복잡해 집니다.
- Better Options:
- 명시적 locks (like ReentrantLock)을 사용하면 더 나은 프로파일링 도구와 모니터링 옵션을 사용하여 스레드 경합과 성능 병목 현상을 분석할 수 있습니다.
Best Practices for Virtual Threads
가상 스레드를 사용할 때 부작용을 방지하려면 다음을 고려하세요.
- Use Fine-Grained Locking:
- 전역 "synchronized" 블록을 피해 경합을 줄입니다.
- 독립적인 작업에는 별도의 lock을 사용하세요.
- Prefer Explicit Locks:
- "synchronized"를 ReentrantLock 또는 가상 스레드와 더 잘 협력할 수 있는 유사한API로 대체합니다.
- Minimize Blocking:
- java.util.concurrent classes (e.g., ConcurrentHashMap, CompletableFuture)와 같은 비차단 동시성 도구를 사용하세요.
- Adopt a Non-Blocking Design:
- 가능한 경우 비동기 API 및 반응형 framework를 사용하세요. 자연스럽게 가상 스레드를 보완합니다.
Conclusion
가상 스레드와 가상 스레드와 "synchronized"를 사용하면 제한된 리소스인 기본 플랫폼 스레드를 차단하여 확장성 이점이 제한됩니다. 'ReentrantLock'과 같은 최신 동시성 기본 요소 또는 비차단 설계를 채택하면 가상 스레드가 보다 효율적으로 작동하여 애플리케이션을 수백만 개의 동시 작업으로 확장할 수 있습니다.
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백엔드개발
- synchronized 단점
- 웹개발
- tdd개발
- java test 개발
- ChatGPT
- spring.io.start
- google commit convention
- 항해후기
- 프로그래밍
- 더현대 크리스마스 현장대기
- 티스토리챌린지
- Java
- mock사용법
- mock해야하는대상과아닌것
- spring
- 캐시스탬피드
- 개발자
- 캐시란
- css
- Grammarly
- html
- Springboot jpa
- JavaScript
- 오블완
- postgresql brew
- commit convetion
- API
- 풀스택
- postgresql 다운로드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함