본문 바로가기
Dev/Java

synchronized 동기화 메소드와 동기화 블록

by vellahw 2022. 9. 29.

 

 

멀티 스레드 프로그램에서는 스레드들이 객체를 공유해서 작업해야 하는 경우가 있다. 이 경우, 스레드 A를 사용하던 객체가 스레드 B에 의해 상태가 변경될 수 있기 때문에 스레드 A가 의도 했던 것과는 다른 결과를 산출 할 수도 있다.

 

스레드가 사용중인 객체를 다른 스레드가 변경 할 수 없도록 하려면 스레드 작업이 끝날 때까지 객체에 잠금을 걸어서 다른 스레드가 사용할 수 없도록 해야 한다.

멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역 (critical section) 이라고 하는데,

자바는 임계 영역을 지정하기 위해 동기화(synchronized) 메소드와 동기화 블록을 제공한다.

스레드가 객체 부의 동기화 메소드 또는 블록에 들어가면 즉시 객체에 잠금을 걸어 다른 스레드가 임계 영역 코드를 실행하지 못하도록 한다.

 

동기화 메소드를 만드는 방법은 메소드 선언에 synchronized 키워드를 붙이면 된다. synchronized 키워드는 인스턴스와 정적 메소드 어디든 붙일 수 있다.

public synchronized void method() {
	임계 영역;
}

 

메소드 전체 내용이 아니라 일부 내용만 임계 영역으로 만들고 싶다면 동기화 블록을 만들면 된다.

public void method() {
 //여러 스레드가 실행 가능 영역
  ...
   sychronized(공유객체) {
   임계 영역
   }
  //여러 스레드가 실행 가능 영역
  ...  
}

 

 

 

댓글