규칙 67 - 과도한 동기화는 피하라

JAVA/Effective Java|2018. 6. 10. 21:17

동기화 시에 너무 많은 동기화 블록을 사용할 경우에 데드락이 걸리거나 성능저하 등등 문제를 일으킬 수 있는 소지들이 몇 가지 있다.


특히 동기화 영역안에서 수행되는 작업의 양을 가능한 줄여야 한다.


자바에서는 동기화에 대한 비용처리가 그나마 잘되어있지만 잘 사용해야 하는 이유는 잘못된 동기화 사용은 각 쓰레드들의 메인 메모리 접근에 대한 지연시간을 늘릴 수 있기 때문에 비용이 증가할 수 있다.


또한 클래스 내에서 동기화를 수행하는 것이 외부에서 객체 호출 시 사용하는것 보다 높은 병행성을 달성 할 수 있을 때문 진행해야한다.


다시말하자면 필요할 때 해당 메서드등을 호출하여 동기화를 실행해야지 해당 메서드 자체를 동기화 하는것은 좋지 않다. 예를 들면 기존에는 StringBuffer를 사용하여 내부적으로 Thread-safe하게 동작하여 많이 사용하였지만 굳이 병렬성을 보장하지 않아도 되는경우에도 자주 사용하여 문제가 자주 발생했다.


그래서 StringBuilder이 생겼고, 필요시에 동기화 블록을 만들어서 Thread safe하게 처리를 하였다.


그리고 


static 필드를 변경하는 메서드가 있을 때는 해당 필드에 대한 접근을 반드시 동기화 해야한다. 왜냐하면 해당 필드에 대해서 다른 쓰레드가 접근하고 있는지에 대해 알 수 있는 방법이 없기 때문이다. 


요약하자면 주의해서 동기화 블록을 사용하고 해당 내용에 대해서 문서에 정확히 적어주어야 한다.

문서에 해당내용을 잘 적지 않는 개발자들이 많다. 잘 적지 않고 알아서 코드를 보고 분석해서 그때그때 사용하기를 원하는 사람들을 일을 하면서 많이 보았다.


물론 같은 개발자로서 코드로 이야기 한다는 명목안에서 그럴 수 있지만, 일에 대한 처리가 순조롭지 않다. 그렇다면 본인들은 개발을 진행할 때 필요한 라이브러리가 있을 때 Document를 보지 않고, 코드를 모두 분석 후 사용하는지 묻고 싶다.. 


협력하는 시대에 협력하지 않고 구태적 마인드를 가지고 있다면 그는 효울적인 자바코드를 사용하는 근본이 잘못되었다고 생각한다.


 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙67

댓글()