자바에서는 스레드를 동기화 하기 위해서 synchronized를 제공한다.

스레드는 synchronized 메소드에 들어가기 위해 lock을 얻고 메소드가 끝이나면 lock을 반환한다. 어떠한 스레드가 lock을 얻어 synchronized 메소드를 사용중이면 다른 메소드는 lock이 없으므로 synchronized에 접근할 수 없고, 다른 스레드가 lock을 반환 할 때까지 기다려야 한다.


쉽게 설명하자면 synchronized 메소드를 화장실에 비교하고 lock을 화장실 열쇠로 비교하겠다. 

화장실(synchronized)에 들어가기 위해서는 열쇠(lock)가 필요한데 열쇠(lock)은 단 1개만 존재하는 것이다. 그래서 어떤 사람이 화장실(synchronized)에 열쇠(lock)를 들고 들어가면 다른 사람은 화장실(synchronized)에 들어갈 열쇠(lock)가 없기 때문에 그 사람이 화장실(synchronized)에서 나올 때 까지 기다려야 한다고 생각하면 된다.


실제로 위와 같은 작업은 JVM에 의해 자동으로 수행되기 때문에 우리는 synchronized 메소드를 이용하기만 하면 된다.


synchronized를 이용하는 방법은 2가지가 있다.

1. synchronized method 방법

2. synchronized block 방법


1. synchronized method

메소드 앞에 synchronized 키워드를 붙여주면 간단하게 사용할 수 있다.


public synchronized 메소드명(파라미터) {
	...
}


2. synchronized block

synchronized 메소드와 기능은 유사하다. 파라미터가 공유할 객체로 들어간다.

synchronized (공유할 객체) {
	...
}


+ Recent posts