4장. 구조적 동시성
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
단순성은 안정성을 위한 전제 조건입니다.
에드거 W. 디크스트라
이전 장에서는 가상 스레드가 Java 동시성에서 블로킹 작업을 처리할 수 있게 함으로써 가능성의 세계를 열어주는 방법을 살펴봤습니다. 큰 오버헤드 없이 수천 개의 경량 가상 스레드를 생성할 수 있기 때문에 블로킹 호출은 더 이상 걱정할 필요가 없습니다. 그러나 여전히 해결해야 할 한 가지 중요한 문제는 작업이 여러 스레드로 세분화되어 분산될 때 작업 간의 관계와 종속성을 관리하는 것입니다.
상위 작업에 각각 다른 스레드에서 실행되는 여러 종속 하위 작업이 있는 시나리오를 상상해 보세요. 상위 작업이 예기치 않게 종료되면 하위 작업은 계속 독립적으로 실행됩니다. 이러한 하위 작업의 결과는 서로 무관해지지만 여전히 리소스를 소비합니다.
게다가 모든 하위 작업이 완료되어야만 상위 작업이 완료되는 경우, 하위 작업 중 하나라도 실패하면 전체 작업이 취소되는 것이 이상적입니다. 이러한 조정 부족으로 인해 수많은 고아 스레드가 발생할 수 있습니다. 이러한 고아 스레드는 불필요한 작업을 수행하여 귀중한 메모리와 프로세서 시간을 소모합니다. 이러한 비효율성은 종종 상당한 비용을 수반합니다.
Java의 ExecutorService 및 Future 과 같은 기존 동시성 모델에서는 작업 계층 구조가 본질적으로 지원되지 않기 때문에 취소를 전파하거나 오류를 체계적으로 처리하기가 어렵습니다. 그 결과 동시 프로그래밍에 대한 접근 방식이 단편적이고 종종 오류가 발생하기 쉽습니다.
구조적 동시성은 관련 작업 그룹을 하나의 작업 단위로 취급하여 이러한 문제를 해결하는 패러다임입니다. 하위 작업의 라이프사이클이 상위 작업에 바운디드되도록 하여 동시 실행을 위한 투명하고 관리하기 쉬운 구조를 제공합니다. 이는 오류 처리 및 취소를 단순화할 뿐만 아니라 동시 실행 코드의 안정성과 관찰 가능성을 향상시킵니다.
이 장에서는 Java의 구조적 동시성을 살펴보고 그 장점과 기존 동시성 모델의 한계를 해결하는 방법을 살펴봅니다. 또한 StructuredTaskScope API를 소개하고, 작업 계층 구조를 관리하는 데 어떻게 도움이 되는지 논의하며, 실제 예제를 통해 그 사용법을 설명합니다. 이 장이 끝나면 Java 애플리케이션에서 구조화된 동시성을 구현하는 방법과 보다 강력하고 유지 보수성 있는 동시 코드를 작성하는 방법을 확실히 이해하게 될 것입니다.
구조화되지 않은 동시성의 과제
Java에서 동시성은 전통적으로 ExecutorService 및 Future 과 같은 추상화를 사용해 관리해 왔습니다. 이러한 클래스는 작업을 동시에 실행할 수 있는 수단을 제공하지만, 특히 작업을 조정해야 하는 경우 몇 가지 문제를 야기하기도 합니다.
웹 애플리케이션에서 제품 세부정보와 관련 리뷰를 가져와 표시해야 하는 일반적인 시나리오를 생각해 보세요. ExecutorService ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access