Tags

, ,

synchronized는 보통 쓰레드(Thread)를 이용해서 프로그래밍을 할 때 동기화를 맞추기 위해서 사용하는 예약어입니다.

메소드 declaration때 사용한다면 일종의 critical section을 정의하는거와 다름없는거 같습니다.

메소드내 코드내에서 특정 변수나 instance에 synchronized 사용하는 것과 method 정의에 사용하는 것은 다를 수있으니 주의해야 합니다.

synchronized를 대충 사용하면 퍼포먼스 저하, 예상치 못한 동작이 발생할 수 있습니다.

public class Test 
{
	public synchronized void getA()
	{
		System.out.println("getA");
	}

	public synchronized void getB()
	{
		System.out.println("getB");
	}

	public void getC()
	{
		System.out.println("getC");
	}
}

메소드 getA와 getB에 synchronized가 사용되었습니다.

멀티 스레드 환경에서 Test클래스 메소드인 getA, B, C에서 getA와 getB는 동시에 진입 불가합니다.

스레드 1이 getA수행할때, 스레드 2는 getA뿐만아니라 getB도 접근이 제한됩니다.

이유인 즉,

public void getA() {
    synchronized (this) {
        ....
    }
}

와 동일한 코드이기 때문입니다.
this라는 인스턴스에 synchronized를 걸기때문에 this를 사용하는 synchronized 메소드는 전부 동시에 진입이 불가능하게 되겠죠?

즉, synchronized를 class내부 메소드에 사용할때는 성능문제를 심각히 고려해봐야합니다.

여기서 하나 더!

instance마다 lock을 걸기때문에 다른 instance를 사용하는 스레드는 각각 진입이 가능합니다.

여러 thread가 하나의 instance에 대해서 메소드를 수행할때 진입이 불가능하다는 얘기잊..

스레드 각각 다른 instance의 메소드를 실행한다면 메소드자체는 실행이 가능해집니다.

synchronized(this)의 의미를 잘 생각해보시면 당연한 결과겠죠?

하지만, static이 붙는다면?

public static synchronized void getA() {
    System.out.println("getA");
}

이때는 얘기가 달라집니다.

왜나면..

synchronized (Test.class) {
 .....
}

와 같은 코드와 동일한 실행이 되므로.

여러 thread가 instance와는 별개로 해당 메소드 실행시 진입이 불가능하게 됩니다.

이거는 더욱 더 조심해서 사용해야겠죠.