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){
//임계영역 코딩
}
}
|
'Development > Java' 카테고리의 다른 글
lock 인터페이스, lock 클래스 종류 (0) | 2018.12.10 |
---|---|
스레드 그룹 정보 얻기 - getThreadGroup(), Thread.getAllStackTraces() (0) | 2018.12.10 |
Thread의 메모리 구조 (0) | 2018.12.07 |
Listener vs Adapter (0) | 2018.12.06 |
Point - java.awt.Point, Point클래스이 멤버변수, Point클래스의 주요 메소드 (0) | 2018.12.05 |