Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 지식 보관소

동기화 메서드와 동기화 블록 (Synchronized Method, Synchronized Block) 본문

프로그래밍 언어/자바

동기화 메서드와 동기화 블록 (Synchronized Method, Synchronized Block)

야식은진리다 2020. 4. 16. 02:46

멀티스레드 프로그램에서 스레드들이 객체를 공유해서 작업하는 경우에 하나의 데이터에 여러 스레드들이 동시에 접근하면 의도치 않은 결과를 만들어 낼 수 있다. 때문에 스레드가 사용 중인 데이터를 다른 스레드가 변경할 수 없도록 잠금을 걸어야 한다.

 

멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역(critical section)이라 부른다. 자바는 이러한 임계 영역을 지정하기 위해 동기화 메서드와  동기화 블록을 제공한다. 스레드가 객체 내부의 동기화 메서드 또는 블록에 들어가면 즉시 객체에 잠금을 걸어 다른 스레드가 임계 영역을 실행하지 못하도록 막는다. 동기화 메서드를 만드는 방법은 선언에 synchronized 키워드를 붙이면 된다.

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

위 코드처럼 인스턴스 메서드를 임계 영역으로 지정하면 각 인스턴스마다 서로 다른 임계영역이 되지만 만약 정적 메서드를 임계영역으로 지정하게 된다면 모든 인스턴스에서, 인스턴스가 몇 개든지 간에 오직 하나의 스레드만이 정적 메서드를 사용할 수 있다.

 

앞선 코드는 메서드 전체를 임계 영역으로 지정하지만 메서드의 일부만 임계 영역으로 만들고 싶다면 동기화 블록을 만들면 된다.

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

위 코드에 있는 공유 객체는 monitor object로서 동기화 블록 안의 코드들은 이 모니터 오브젝트에 의해 동기화된다.

간단히 말해서 각 모니터 오브젝트마다 하나의 스레드가 코드를 실행시킬 수 있다.