[Java] 병렬 프로그래밍에서 잊지말아야 할 조언들[Java] 병렬 프로그래밍에서 잊지말아야 할 조언들

Posted at 2013. 8. 17. 18:04 | Posted in 개발이야기




여러 스레드가 클래스에 접근할 때, 실행 환경이 해당 스레드들의 실행을 어떻게 스케줄하든 어디에 끼워 넣든, 호출하는 쪽에서 추가적인 동기화나 다른 조율 없이도 정확하게 동작하면 해당 클래스는 스레드 안전하다고 말한다.(p.48)


상태 없는(Stateless) 객체는 항상 스레드 안전하다. (p.49)


종종 단순성과 성능이 서로 상충할 때가 있다. 동기화 정책을 구현할 때는 성능을 위해 조급하게 단순성(잠재적으로 안전성을 훼손하면서)을 희생하고픈 유혹을 버려야 한다. (p.65)

일례로, 한 클래스의 멤버 변수를 public으로 노출하여 사용한 경우, 이 변수가 어디서 어떻게 쓰일지 알 수 없으므로, 이 클래스를 Thread safe하게 만들기 위해서는 해당 변수를 사용한 곳을 모두 조사해봐야 한다. 그러나 private으로 숨기고 getter/setter를 사용한 경우 method 레벨에서 동기화를 구현하면 쉽게 Thread Safe한 클래스가 될 수 있다.

따라서, 번거럽더라도 getter/setter를 쓰는 것이 좋다. 너무도 명백하게 내부적으로 잠시 사용하는 inner class 같은 것들까지 getter/setter를 쓰는건 과한 것일 수도 있으니 적절히 판단해서 사용하자.

동기화와 캡슐화에 대한 이야기는 책의 여기저기에서 다른 표현들로 등장한다.


복잡하고 오래 걸리는 계산 작업, 네트웍 작업, 사용자 입출력 작업과 같이 빨리 끝나지 않을 수 있는 작업을 하는 부분에서는 가능한 한 락을 잡지 말아라. (p.65)



(계속)




//