본문 바로가기
왜?

[왜] synchronized block은 오버헤드를 증가시킬까?

by KKambi 2020. 4. 19.

synchronized란?

  • 메소드나 블록 코드에 동기화 영역을 표시
  • 동기화 블록은 한 시점에, 1개의 쓰레드만이 접근 가능
  • 블록에 접근을 시도하는 다른 쓰레드들은 블록 안 쓰레드가 실행을 마치고 블록을 벗어날 때까지 블록(blocked) 상태
  • 즉, 멀티스레드의 동시접근을 방지


사용처

  1. 메소드
    • method에 synchronized를 걸 경우, 그 함수가 포함된 객체에 lock을 거는 것
  2. 코드블록


synchronizd method

  1. synchronized instance method
    • 인스턴스 메소드 동기화
    • 메소드를 가진 인스턴스 기준으로 lock
    • 호출하는 인스턴스가 같다면, 1개 쓰레드가 1번 instanec method를 수행할 때, 나머지 쓰레드는 모든 instance method를 수행할 수 없다.
    • 호출하는 인스턴스가 다르다면, 상관없이 접근할 수 있다.
  2. synchronized class method
    • 클래스 메소드 동기화
    • 메소드를 가진 클래스 기준으로 lock
    • JVM 안에 클래스 객체는 클래스 당 1개밖에 존재할 수 없다.
    • 따라서, 1개 쓰레드가 1번 static method를 수행할 때, 나머지 쓰레드는 모든 static method를 수행할 수 없다.
  3. 두 방법을 혼용할 때
    • synchronized class method는 클래스 객체에 lock을 걸지만 인스턴스에는 lock을 걸지 않음
    • 따라서, 혼용할 경우 동기화 이슈 발생 가능


synchronized block

  • 동기화 블록은 lock을 걸 대상으로 파라미터를 받음
  • 동기화 블록 안에 전달된 객체 = 모니터 객체라 부른다
  • 여러 쓰레드가 다른 synchronized 부분을 호출해도, 똑같이 this가 모니터 객체라면 기다려야 함
  1. synchronized block in instance method
    • 인스턴스 메소드 내의 동기화 블록
    • 동기화 블록의 인자값으로 this(자기 인스턴스) or 멤버변수를 모니터 객체로 지정
  2. synchronized block in class method
    • 스태틱 메소드 내의 동기화 블록
    • 동기화 블록의 인자값으로 MyClass.class를 모니터 객체로 지정


오버헤드란?

  • 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간과 메모리 (리소스)
  • 특정한 기능을 수행하기 위해 추가로 사용되는 컴퓨터 자원


멀티스레드 환경에서의 Synchronized 키워드가 Overhead를 증가시키는 이유

  • 모니터를 기다리고(block) 얻는(unblock) 과정에서의 대기시간
  • block, unblock 자체의 수행시간

    결과적으로 오버헤드 증가 (퍼포먼스 저하)



참고링크1-박철우님 블로그
참고링크2-투덜이님 블로그
참고링크3-투덜이님 블로그2

댓글