synchronized란?
- 메소드나 블록 코드에 동기화 영역을 표시
- 동기화 블록은 한 시점에, 1개의 쓰레드만이 접근 가능
- 블록에 접근을 시도하는 다른 쓰레드들은 블록 안 쓰레드가 실행을 마치고 블록을 벗어날 때까지 블록(blocked) 상태
- 즉, 멀티스레드의 동시접근을 방지
사용처
- 메소드
- method에 synchronized를 걸 경우, 그 함수가 포함된 객체에 lock을 거는 것
- 코드블록
synchronizd method
- synchronized instance method
- 인스턴스 메소드 동기화
- 메소드를 가진
인스턴스
기준으로 lock - 호출하는 인스턴스가 같다면, 1개 쓰레드가 1번 instanec method를 수행할 때, 나머지 쓰레드는 모든 instance method를 수행할 수 없다.
- 호출하는 인스턴스가 다르다면, 상관없이 접근할 수 있다.
- synchronized class method
- 클래스 메소드 동기화
- 메소드를 가진
클래스
기준으로 lock - JVM 안에 클래스 객체는 클래스 당 1개밖에 존재할 수 없다.
- 따라서, 1개 쓰레드가 1번 static method를 수행할 때, 나머지 쓰레드는 모든 static method를 수행할 수 없다.
- 두 방법을 혼용할 때
- synchronized class method는 클래스 객체에 lock을 걸지만 인스턴스에는 lock을 걸지 않음
- 따라서, 혼용할 경우 동기화 이슈 발생 가능
synchronized block
- 동기화 블록은 lock을 걸 대상으로 파라미터를 받음
- 동기화 블록 안에 전달된 객체 =
모니터 객체
라 부른다 - 여러 쓰레드가 다른 synchronized 부분을 호출해도, 똑같이 this가 모니터 객체라면 기다려야 함
- synchronized block in instance method
- 인스턴스 메소드 내의 동기화 블록
- 동기화 블록의 인자값으로 this(자기 인스턴스) or 멤버변수를 모니터 객체로 지정
- synchronized block in class method
- 스태틱 메소드 내의 동기화 블록
- 동기화 블록의 인자값으로 MyClass.class를 모니터 객체로 지정
오버헤드란?
- 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간과 메모리 (리소스)
- 특정한 기능을 수행하기 위해 추가로 사용되는 컴퓨터 자원
멀티스레드 환경에서의 Synchronized 키워드가 Overhead를 증가시키는 이유
- 모니터를 기다리고(block) 얻는(unblock) 과정에서의 대기시간
- block, unblock 자체의 수행시간
결과적으로 오버헤드 증가 (퍼포먼스 저하)
'왜?' 카테고리의 다른 글
[왜] 스프링부트 테스트에서 repository save()가 반환하는 객체를 사용해야 할까? (0) | 2020.05.11 |
---|---|
[왜] 스프링부트의 repository는 클래스가 아니라 인터페이스일까? (0) | 2020.05.11 |
[왜] gradle은 다운로드한 의존성 파일(jar)을 해당 프로젝트에 보관하지 않을까? (0) | 2020.04.25 |
[왜] 로그 찍을 때 System.out.println을 사용하면 안 좋을까? (0) | 2020.04.18 |
댓글