동기화 방법-synchronized - 메서드의 동기화 방법(synchronized기반 동기화 메소드), 특정 블록의 동기화 방법(synchronized기반 동기화 블록)

CODEDRAGON Development/Java

반응형

 

동기화 방법-synchronized

JAVA에서 임계코드를 동기화하기 위해서 제공하는 구문으로 2가지 방법이 있습니다.

아래의 두 방법 모두 lock의 획득과 반납과정은 모두 자동으로 이루어지기 때문에 임계 영역만 잘 설정해주면 됩니다.

·       메서드의 동기화 방법(synchronized기반 동기화 메소드)

·       특정 블록의 동기화 방법(synchronized기반 동기화 블록)

 

 

메서드의 동기화 방법(synchronized기반 동기화 메소드)

·       synchronized 선언으로 인해서 synchronizedMethod메소드는 쓰레드에 안전한 함수가 됩니다. 메소드 전체가 임계 영역으로 설정됩니다.

·       synchronizedMethod가 호출되면 해당 메소드가 포함한 객체의 lock을 얻어 작업을 수행하다가 해당 메소드가 종료되면 lock을 반환하게 됩니다.

·       그러나 엄청난 성능의 감소를 동반합니다. 그렇기 때문에 아래의 코드와 같은 메소드의 빈번한 호출은 성능에 문제가 될 수 있습니다.

 

접근지정자 synchronized 리턴타입 메소드명( )

}

public synchronized void synchronizedMethod(){

//임계영역 코딩

}

 

 

 

 

특정 블록의 동기화 방법(synchronized기반 동기화 블록)

·       동기화 블록을 이용하면 동기화의 대상이 되는 영역을 세밀하게 제한(임계 영역을 최소화)할 수 있습니다.

·       synchronized(this)에서 this는 동기화의 대상을 알리는 용도로 사용이 되었습니다. , 메소드가 호출된 인스턴스를 대상으로 동기화를 진행하는 문장입니다. 공유객체가 객체 자신이면 this를 넣을 수 있습니다.

·       공유객체(참조변수) lock을 걸고자하는 객체를 참조하는 것이여야 합니다. 이 블록 영역 안으로 들어가게 되면 쓰레드는 지정된 객체의 lock을 얻게 되고 이 블록을 빠져나오면 lock을 반납하게 됩니다.

 

접근지정자 리턴타입 메소드명( ) {

synchronized(공유객체){ 

}

}

 

public void normalMethod(){

synchronized(this){

//임계영역 코딩

}

}