멀티스레드와 동시성

Ch06. 동기화 - Synchronized 정리

webmaster 2024. 8. 12. 07:37
728x90

자바는 처음부터 멀티스레드를 고려하고 나온 언어이다. 그래서 자바 1.0부터 synchronized 같은 동기화 방법을 프로그래밍 언어의 문법에 포함해서 제공한다.

synchronized 장점

  • 프로그래밍 언어에 문법으로 제공
  • 아주 편리한 사용
  • 자동 잠금 해제: synchronized 메서드나 블록이 완료되면 자동으로 락을 대기 중인 다른 스레드의 잠금이 해제된다. 개발자가 직접 특정 스레드를 깨우도록 관리해야 한다면, 매우 어렵고 번거로울 것이다.

synchronized는 매우 편리하지만, 제공하는 기능이 너무 단순하다는 단점이 있다. 시간이 점점 지나면서 멀티스레드가 더 중요해지고 점점 더 복잡한 동시성 개발 방법들이 필요해졌다.

synchronized 단점

  • 무한 대기: "BLOCKED" 상태의 스레드는 락이 풀릴 때까지 무한 대기한다.
    • 특정 시간까지만 대기하는 타임아웃 X
    • 중간에 인터럽트 X
  • 공정성: 락이 돌아왔을 때 "BLOCKED" 상태의 여러 스레드 중에 어떤 스레드가 락을 획득할지 알 수 없다. 최악의 경우 특정 스레드가 너무 오랜 기간 락을 획득하지 못할 수 있다.

synchronized의 가장 치명적인 단점은 락을 얻기 위해 "BLOCKED" 상태가 되면 락을 얻을 때까지 무한 대기한다는 점이다. 비유를 하자면 맛집에 한 번 줄을 서면 10시간이든 100시간이든 밥을 먹을 때까지 강제적으로 계속 기다려야 한다는 점이다.
예를 들어 웹 애플리케이션의 경우 고객이 어떤 요청을 했는데, 화면에 계속 요청 중만 뜨고, 응답을 못 받는 것이다. 차라리 너무 오랜 시간이 지나면, 시스템에 사용자가 너무 많아서 다음에 다시 시도해 달라고 하는 식의 응답을 주는 것이 더 나은 선택일 것이다.

 

결국 더 유연하고, 더 세밀한 제어가 가능한 방법들이 필요하게 되었다. 이런 문제를 해결하기 위해 자바 1.5부터 java.util.concurrent라는 동시성 문제 해결을 위한 패키지가 추가된다. 참고로 단순하고 편리하게 사용하기에는 synchronized 좋으므로, 목적에 부합한다면 synchronized를 사용하면 된다.

728x90