본문 바로가기

Programming/JAVA

멀티 스레드(4) - 동기화 메서드와 동기화 블록 2

JAVA logo image

 

 

 

 

앞선 아티클에서 공유 객체를 사용하는 과정에 대해서 살펴보았습니다. 그럼 반대로 한 객체를 특정 스레드가 사용 중일 때 다른 스레드가 변경할 수 없도록 만드는 기능도 필요해질 것입니다. 

 

멀티 스레드 체계에서 딱 하나의 스레드만 실행할 수 있는 영역을 임계 영역(critical seciton)이라고 칭하는데, 이 임계 영역은 동기화(synchronized) 메서드/블록을 통해서 설정이 가능합니다. 스레드가 어떤 객체 내부의 동기화 메서드 / 블록에 들어가면, 즉시 객체가 잠기며 다른 스레드가 해당 임계 영역의 코드를 실행하지 못하게 됩니다. 

 

 

 


 

 

○ synchronized 사용법

 

기본적으로 동기화 메서드를 선언할 때는 메서드 선언에 synchronized 키워드를 포함하면 됩니다. 인스턴스, static에도 사용이 가능합니다.

 

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

 

 

동기화 메서드의 경우 스레드가 동기화 메서드를 실행하면 즉시 객체에 잠금이 발생하고, 스레드가 동기화 메서드를 실행 종료하면 잠금이 풀리는 구조입니다.

 

 

만일 메서드 중 일부 내용만을 임계 영역으로 선언하고 싶을 경우에는 synchronized 블록을 선언할 수 있습니다.

 

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