자바 병렬 프로그래밍
Description
자바 병렬 처리 프로그램 작성 안내서!
이 책은 자바 병렬 프로그래밍 참고 매뉴얼이다. 병렬 처리 관련 기능에 어떤 것이 있고, 어떻게 사용하는지에 대한 방법뿐 아니라, 그 내부에 숨어 있는 디자인 패턴과 그 패턴을 사용한 원론적인 이유도 살펴본다. 특히 자바 멀티스레드 프로그램에 대한 설계와 구현 노하우를 전수한다.

자바 병렬 프로그래밍 API에 대한 훌륭한 가이드북이자, 스레드 관련 전문 지식을 빼놓지 않고 설명한 점이 돋보인다. 본문은 병렬 처리와 스레드 안전성에 대한 기초, 스레드 안전한 클래스를 작성하는 기법, java.util.concurrent 패키지에 들어 있는 라이브러리 클래스 활용법, 성능 최적화를 위해 취해야 할 방법, 병렬 처리 프로그램 테스트 방법을 설명한다.

단일 연산 변수, 넌블로킹(Non-blocking) 알고리즘, 자바 메모리 모델과 같은 고급 주제도 다룬다. 멀쩡한 코드에서 왜 오류가 발생하는지, 오류를 어떻게 해결하고 성능을 높일 수 있는지 등을 속 시원히 파헤친다. 또한 최신 하드웨어 또는 미래의 시스템에서 안전하면서 확장성 높게 동작할 수 있는 자바 프로그램 작성에 필요한 개념과 기법도 소개한다.
저자

데이빗 홈즈

지은이 <b>브라이언 게츠</b> & <b>더그 리 외</b>

저자진은 자바 커뮤니티 프로세스(Java Community Process)의 JSR-166 전문가 그룹(Expert Group)에 속해있으며, 다른 여러가지 JCP 전문가 그룹에서도 활동하고 있다. 브라이언 게츠(Brian Goetz)는 IT 분야에서 20여 년간 활동한 경험을 바탕으로 소프트웨어 컨설팅을 하고 있으며, 자바 개발과 관련해 75개 이상의 글을 기고한 바 있다. 팀 피얼스(Tim Peierls)는 BoxPop.biz 사이트와 음반 시장, 공연 분야 등에서 다양한 일을 하고 있는 그야말로 최신 멀티코어 프로세서의 모델이다. 조셉 보우비어(Joseph Bowbeer)는 Apollo 컴퓨터 시절부터 IT 분야 일을 시작했으며 병렬 처리 프로그래밍에 꿈을 갖고 있는 자바 ME 전문가이다. 데이빗 홈즈(David Holmes)는 『The Java Programming Language』의 공동 저자이며 썬마이크로시스템즈에서 일하고 있다. 조슈아 블로쉬(Joshua Bloch)는 구글의 최고 자바 아키텍트이며 『Effective Java』의 저자이면서 『Java Puzzlers』의 공동 저자이기도 하다. 더그 리(Doug Lea)는 『Concurrent Programming in Java』의 저자이며, SUNY Oswego(뉴욕 주립 대학 at Oswego)의 컴퓨터 공학 전공 교수이다.

옮긴이 <b>강철구</b>

아주대학교와 대학원에서 컴퓨터 비젼(영상 인식)을 전공했다. 검색 엔진, 웹, 분산 및 병렬, 소셜 네트워킹, 인공 지능 등의 키워드에 관심이 많다. 현재는 루씬을 이용한 검색 솔루션과 플랫폼을 개발하고 있으며, 관심사와 연결되는 새롭고 재미있는 비즈니스를 준비하고 있다. 에이콘출판사에서 출간한 『루씬 인 액션』(2005)과 『Ajax 인 액션』(2006)을 번역했다.

목차

1장 들어가며

1부 기본 원리
2장 스레드 안전성
3장 객체 공유
4장 객체 구성
5장 프로그래밍 단위

2부 병렬 프로그램 구조 잡기
6장 작업 실행
7장 중단 및 종료
8장 스레드 풀 활용
9장 GUI 애플리케이션

3부 가용성, 성능, 테스트
10장 가용성을 최대로 높이기
11장 성능, 확장성
12장 병렬 프로그램 테스트

4부 고급 주제
13장 명시적인 락
14장 전용 동기화 기능 구현
15장 단일 연산 변수와 넌블로킹 동기화
16장 자바 메모리 모델

부록 A 병렬 프로그램을 위한 어노테이션

출판사 서평

스레드는 자바 플랫폼에서 가장 기본적으로 제공되는 기능 중 하나다. 멀티코어 프로세서가 대중화되면서 고성능 애플리케이션을 작성할 때 병렬 처리 능력을 효과적으로 활용하는 일의 중요성이 점차 부각되고 있다. 자바 SE 5와 6은 JVM 수준에서 뛰어난 성능과 높은 확장성을 함께 확보할 수 있도록 지원하고 다양한 종류의 병렬 처리 기반을 라이브러리로 제공하고 있어 병렬 처리 애플리케이션을 작성하고자 할 때 큰 짐을 덜어준다. 이같은 기능을 자바에 추가한 핵심 인력이 직접 집필한 이 책에서는, 병렬 처리 관련 기능에 어떤 것이 있고 어떻게 사용하는지에 대한 방법뿐 아니라, 그 내부에 숨어 있는 디자인 패턴과 그 패턴을 사용한 원론적인 이유도 함께 소개한다.

멀티스레드 프로그램을 작성하고 테스트하고 디버깅하는 일은 여전히 굉장히 어려운 작업이다. 병렬 처리 프로그램이 올바르게 동작하는 것처럼 보일 정도로 만들기는 쉽지만, 실서버에 적용하고 부하가 걸리는 시점이 되면 어김없이 오류가 발생한다. 이 책을 읽은 독자는 이론적인 기반과 함께 안정적이고 확장성 높고 유지보수가 간편한 병렬 처리 프로그램을 작성하는 방법을 배울 수 있다. 이 책에서 병렬 처리 API와 그 구조에 어떤 것이 있는지 뿐만 아니라 설계상의 규칙, 디자인 패턴, 그리고 병렬 처리 프로그램을 작성하는 개발자가 갖춰야 할 자세까지 익힘으로써, 올바르게 동작하면서 동시에 훌륭한 성능을 지닌 병렬 처리 프로그램을 작성할 수 있다.

추천의 글

자바5.0과 자바6 버전에서 자바 플랫폼에 추가된 병렬 프로그래밍 기법을 설계하고 구현하는 멋진 팀에서 일할 수 있어서 너무나 행운이라고 생각합니다. 이제 그 멋진 팀에서 병렬 프로그램을 위한 새로운 기능뿐만 아니라 전반적인 병렬 프로그래밍 관련 내용까지 설명하고 있습니다. 병렬 프로그램은 더 이상 고급 개발자만이 할 수 있는 일이 아닙니다. 자바 개발자라면 반드시 읽어봐야 할 책입니다.
- 마틴 부시홀즈(Martin Buchholz) 썬마이크로시스템즈 JDK 병렬 프로그래밍 전문가

지난 30년간 컴퓨터 프로그램의 성능은 무어의 법칙(Moore's Law)에 따라 성장해왔습니다. 하지만 이제부터는 암달의 법칙(Amdahl's Law)에 의해 발전하게 될 것입니다. 여러 개의 프로세서를 효율적으로 활용하는 프로그램을 작성한다는 건 굉장히 어려운 일입니다. 『자바 병렬 프로그래밍』은 최신 하드웨어 또는 앞으로 사용하게 될 미래의 시스템에서 안전하면서 확장성 높게 동작할 수 있는 자바 프로그램을 작성하는 데 꼭 필요한 개념과 기법을 소개합니다.
- 도런 레이원(Doron Rajwan) 인텔 연구 과학자

멀티스레드로 동작하는 자바 프로그램을 개발하거나 설계하거나 디버깅하고 있거나 유지보수하고 있거나 그냥 자세히 뜯어보고 있기라도 하다면 반드시 읽어야 할 책입니다. 메소드에 synchronized 키워드를 적어 넣으면서 왜 그래야만 하는지를 충분히 이해하지 못하고 있었다면 본인뿐 아니라 메소드를 사용하는 사용자도 함께 이 책을 처음부터 끝까지 읽어야 합니다.
- 테드 뉴워드(Ted Neward) Effective Enterprise Java의 저자

저자인 브라이언은 병렬 프로그램과 관련된 원론적인 부분과 그 복잡성을 독보적인 명료함으로 담아내고 있다. 스레드를 사용하거나 성능에 신경을 써야 하는 모든 개발자가 반드시 읽어야 할 책이다.
- 커크 페퍼다인(Kirk Pepperdine) JavaPerformanceTuning.com의 CTO

이 책에서는 매우 심도있고 세밀한 내용까지 깔끔하고 명료하게 다루고 있으며, 자바 병렬 프로그래밍에 대한 완벽한 참고 매뉴얼이라고 할 수 있다. 개발자 입장에서 일상적으로 다뤄야 하는 다양한 문제점(뿐만 아니라 그 해결책까지)을 자세히 담았다. 무어의 법칙을 통해 더 빠른 프로세서를 만드는 대신 더 많은 프로세서를 사용하는 게 일반화되어 가고 있기 때문에 병렬 프로그램을 효과적으로 작성하는 방법이 점점 더 중요해지고 있으며, 이 책에서 바로 그런 방법을 소개하고 있다.
- 클리프 클릭 박사(Dr. Cliff Click) Azul Systems의 선임 소프트웨어 엔지니어

개인적으로 병렬 프로그래밍에 관심이 매우 높으며, 어떤 개발자보다도 더 많은 스레드 데드락을 경험해봤으며 동기화 기법을 잘못 사용해본 경험 역시 훨씬 많을지도 모릅니다. 『자바 병렬 프로그래밍』은 자바에서의 스레드와 병렬 프로그래밍에 대해 가장 읽을 만한 책이며, 어려운 주제를 놀랍도록 쉬운 예제로 풀어나가고 있습니다. 이 책은 재미있으면서 굉장히 유용하고 또한 자바 개발자라면 자주 맞닥뜨리는 문제를 직접 다루고 있기 때문에 The Java Specialists' Newsletter의 독자 모두에게 추천하고 싶은 책입니다.
- 하인즈 캐뷰츠 박사(Dr. Heinz Kabutz) The Java Specialists' Newsletter

지금까지 단순한 문제를 단순화하는 일을 해왔지만, 이 책은 복잡하면서도 아주 중요한 주제인 병렬 프로그래밍에 대한 내용을 야심차게 게다가 효과적으로 간결하게 다루고 있습니다. 『자바 병렬 프로그래밍』의 접근 방법은 굉장히 혁신적이며 이해하기 쉽게 쓰여졌고, 적절한 시점에 필요한 내용을 담았습니다. 반드시 굉장히 중요한 책이 되리라고 생각합니다.
- 브루스 테이트(Bruce Tate) Beyond Java의 저자

『자바 병렬 프로그래밍』은 자바 개발자에게 꼭 필요한 스레드 관련 노하우를 집대성한 위대한 책입니다. 자바 병렬 프로그래밍 API에 대한 훌륭한 가이드이기도 하지만, 어디에서도 찾아볼 수 없을 스레드 관련 전문 지식을 하나도 빼놓지 않으면서도 쉽게 접근할 수 있도록 다루고 있기 때문에 이 책을 읽다 보니 지적인 흥분을 느낍니다.
- 빌 베너스(Bill Venners) Inside the Java Virtual Machine의 저자

저자 서문
이 책을 쓰는 시점에도 일반적인 데스크탑 시스템에서조차 멀티코어 프로세서가 비싸지 않은 가격으로 대중화되어 가고 있다. 우연찮게 수많은 개발팀이 진행하는 프로젝트에서 스레드와 관련된 버그가 자꾸만 늘어나고 있다는 사실을 쉽게 알 수 있다. 넷빈즈(NetBeans) 개발 사이트에 최근에 올라온 글을 보면, 단 하나의 클래스를 놓고 스레드 관련 문제점을 수정하기 위해 14번이나 코드를 수정했다는 사실을 핵심 유지보수 담당자가 알아차린 사례도 있다. TheServerSide의 편집장을 지냈던 디온 앨메어는 (결국 스레드 관련 문제라고 결론이 나왔던 고통스러운 디버깅 작업을 끝낸 이후에) 대부분의 자바 프로그램이 "어쩌다보니 실수로 동작하는" 것일 뿐이며 스레드 관련 버그가 굉장히 자주 발생한다는 내용의 블로그 포스트를 올린 적도 있다.

스레드 관련 오류는 예측 가능한 상태로 스스로를 드러내는 법이 거의 없기 때문에 스레드를 사용하는 프로그램을 개발하고 테스트하고 디버그하는 일은 실제로 엄청나게 어려운 일이 될 수 있다. 게다가 문제점은 항상 최악의 시점, 즉 실제 사용 환경에서 부하가 많이 걸릴 때 주로 나타난다.

자바로 병렬 프로그램을 작성할 때 넘어야 할 가장 큰 산중의 하나는 플랫폼에서 제공하는 병렬 프로그래밍 기법과 개발자가 자신의 프로그램에서 병렬 프로그래밍 기법을 어떻게 사용하려 하는지 간에 큰 차이가 있다는 점이다. 자바 언어에서는 동기화나 조건부 대기와 같은 저수준의 도구(mechanism)를 제공하지만, 이런 도구를 사용해 애플리케이션 수준의 규칙이나 정책(policy)을 일관적으로 구현할 수 있어야 한다. 컴파일 잘 되고 실행도 잘 된다고 생각되는 프로그램은 쉽게 작성할 수 있겠지만, 이런 정책이 없다면 오류가 금새 나타나고야 만다. 병렬 프로그래밍에 대한 다른 훌륭한 책이 많지만 대부분 설계 수준의 정책이나 패턴에 대해서 다루기 보다는 저수준의 API에 집중하고 있어 이와 같은 정책의 중요성에 대처하는 면이 부족했다고 생각된다.

자바5.0은 고수준의 컴포넌트와 저수준의 도구를 모두 제공하기 때문에 초보자나 전문가 모두가 병렬 프로그램을 쉽게 작성할 수 있게 되었다는 점에서 큰 발전을 이뤘다고 볼 수 있다. 이런 기능을 실제로 구현하는데 참여했던 JCP 전문가 그룹에서 이 책을 쓰는데 많이 참여했다. 추가된 기능과 동작하는 구조를 설명하는 것뿐만 아니라 그 기반이 되는 디자인 패턴과 함께 플랫폼 라이브러리에 추가되는데 중요한 역할을 했던 예상 활용 시나리오도 함께 소개한다.

이 책을 읽는 독자는 여러 가지 설계상의 규칙을 이해하고, 또한 자바 클래스나 애플리케이션이 올바르게 높은 성능으로 동작하도록 작성하는 과정이 더 쉽고 재미있는 일이 되도록 만들고자 하는 목표가 있다.

『자바 병렬 프로그래밍』을 즐겁게 읽고 유익하게 활용하길 바란다.

브라이언 괴츠(Brian Goetz)

역자 서문
학교를 졸업하고 처음 회사에 취직한 이후에 담당했던 개발 업무 가운데 상당 부분은 자바로 서버 프로그램을 작성하는 일이었습니다. 수십에서 수백 대에 이르는 클라이언트를 대상으로 24시간 동작하는 서버를 작성하는 업무는 꽤나 재미있었습니다. 몇 날 며칠을 고생해서 만든 서버 프로그램이 어딘가 누군가의 서버에 설치되어 24시간 동작하면서 제 할 일을 하고 있는 모습을 보면 건방지게도 자식이 제 할 일을 잘 할 때 부모가 받았을 느낌을 느낄 수 있었다고도 생각합니다.

하지만 어려운 병렬 처리 이론이 아닌 멀티스레드를 사용해 프로그램하는 실습 위주의 교육을 받은 적이 없는지라, 단순하게 멀티스레드로만 동작하는 '자식같은' 프로그램이 알 수 없는 오류를 뿌리면서 곳곳에서 뻗어버리는 모습을 보면 참 안타까웠습니다 (오류라도 뿌리고 죽으면 그나마 다행입니다). 예전 버전의 자바는 운영체제마다 스레드의 동작 모습이 많이 달라서 어려운 점도 많았습니다. 운영체제마다 다른 스케줄