WEB/JAVA

내가 보려고 정리하는 JAVA 멀티 스레드 2 - 동기화 메서드와 동기화 블록

동기화 메서드와 동기화 블록

멀티스레드 프로그램에서는 스레드들이 객체를 공유해서 작업해야 하는 경우가 있다.

스레드a가 사용하던 객체를 b에 의해 상태가 변경 될 수 있어서 a가 의도했던 결과와 달라질 수 있기 때문에 

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

 

단 하나의 스레드를 실행하는 임계 영역을 만들어주면 된다. 

-> 스레드가 객채 내부의 동기화 메소드 또는 블록에 들어가면 즉시 객체에 잠금을 걸어 다른 스레드가 영역에 있는 코드를 실행하지 못하도록 한다. 메서드 실행 종료 되면 잠금이 풀린다. 

 

사용방법은 아래와 같다

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

일부 내용만 만들고 싶다면 아래와 같이 블록을 만들면 된다

public void method(){
	syncronized(공유객체){ // 객체 자신이면 this를 넣을 수 있다.
    	// 임계 영역
    }
}

 

스레드1이 작동하는 동안에는 동기화 메서드/블록 은 잠겨있다 그동안 스레드2는 스레드1이 작업을 끝낼때 까지 기다린다.

하지만 일반 메서드 일 경우에는 스레드1, 스레드2 가 동시에 작업을 실행 한다.