| 자바에서 제일 까다롭다고 생각되는 쓰레드를 쉽고 간결하고 명확하게 설명하고 있다. 책의 진행이 현재 나와있는 여러 패턴책의 진행을 따라했고, 예제 코드가 자바 표준을 지키고 있어서 읽기가 매우 편하다. Allen Holub의 Taming Java Threads 와는 달리 친근하게 설명하려는 저자의 의도가 인상적이다. 각종 패턴을 이리저리 말로 설명하는 것 보다는 처음부터 JAVA 소스코드를 보여 주고 그 코드를 설명하는 구조를 취하고 있다. 따라서 이 패턴이 언제 쓰이는 지, 어떤 상황일 때 쓰이는 지 구체적으로 알 수 있다. 각 예제는 최대한 간단하고 명확하게 작성되있어 이해속도가 빠르다. 또한 각 장당 소스가 독립되어 있어, Taming Thread 에서와 같이 현재 쓰이는 클래스를 알기 위해 책 앞을 뒤적거리는 일은 안해도 된다. 마지막으로 번역이 아주 매끄럽게 잘 되어있어 가뜩이나 이해하기 어려운 주제를 더더욱 미궁에 빠뜨리는 일이 없다. =) |
|
멀티쓰레드 패턴이 잘 정리된 유일한 번역서 !! 2014년 지금 현재까지도 유효한 책이다. 멀티쓰레드패턴에 대한 책중에서도 거의 유일하다시피 하다. POSA2 편이 그러한 내용인데 이 책보다는 난이도가 있다. Erlang같은 언어라든지 akka 같은 액터모형라이브러리를 시작하기전에 이 책을 통해 기초를 확실히 닦을수있다. 1.Single threaded execution 패턴 -> 어떤 함수에 들어갈수있는건 하나의 쓰레드로 제약함 (자바 synchronized 나 WINAPI 의 CriticalSection 해당) 2.Immutable 패턴 -> 객체지향언어에서 상태변수의 위험성을 제거하고자 한번 만든 변수는 절대 변하지 않게하는 의도 ( 자바의 final 을 사용한다던지 Set 함수가 없고 private ) 3.Guarded Suspension 패턴 -> 준비가 될때까지 쓰레드 네놈은 기다리고 있어라!! ( 자바의 wait / notifyAll , WINAPI 의 Event / WaitForSingleObject ) 4. Balking 패턴 -> 필요없으면 관둬요. (필요없는 대기나 메소드 과잉 실행을 방지) ( 만약 isChanged 같은 변수를 둬서 true가 아니면 바로 리턴. 조건충족이 안되면 기다리지 않는다. ) 5. Producer - Consumer 패턴 -> 한쪽 쓰레드는 준비작업을 해서 큐에 넣고 한쪽쓰레드는 큐에서 빼서 작업한다. ( JAVA 나 C++ 이나 이 패턴은 작업 큐를 잘 만드는게 중요) 6. Read-Write Lock 패턴 -> 모두 읽어도 좋지만 읽고있을때 쓰면 안돼요. ( 보통 컬렉션에 대한 읽기동작이 많은데 그것에 락을 걸면 수행능력이 저하된다. 그래서 쓸때만 락이 걸리게함) ( ReadWriteLock 클래스를 보통 만든다) 7. Thread-per-Message패턴 -> 별도의 쓰레드에 일을 맡기고 사용자는 바로 다음 작업을 진행. 응답성을 좋게한다. ( 어떤 명령이나 요구마다 새롭게 하나의 쓰레드를 생성/할당한다) 8. Worker Thread 패턴 -> 일이 올때까지 기다리고 일이 오면 일한다. ( ThreadPool 같은데에 쓰레드 여러개를 생성해둔다음에 일을 해야하면 꺼내서 실행시킨다) 9. Future 패턴 -> 별도의 쓰레드에 맡겨진 작업을 던지고 객체를 리턴받아서 작업이 끝날때쯤에 리턴받은 객체로 작업결과 얻음. ( C++ 에서도 std:future 지원하고 자바도 future 클래스를 지원한다.) ( 비동기처리를 위해서 많이 사용되는데 Future 객체를 생성하거나 함수포인터를 넘겨서 니가 알아서 실행해!라고 사용되기도 한다.) 10. Two-Phase Terminate 패턴 -> 쓰레드를 안정하게 종료시키는 방법에 관한 패턴이다. 11. Thread-Specific Storage 패턴 -> 쓰레드마다 동일한 상태를 접근하면 문제가 생기지 않는가? 따라서 쓰레드마다 고유의 저장소를 생성해서 사용하게 한다. ( WINAPI 에도 TSS 를 지원하고 있고 자바는 java.lang.ThreadLocal클래스를 지원한다) 12. Active Object 패턴 -> 비동기 메세지를 받아들이는 기능적인 객체 (메서드 호출과 메서드 실행을 분리한다.) |