자바에서 synchronized 키워드에 관해 질문드립니다.

vudghkzm의 이미지

class A {
    public synchronized void f1() {
        ....
    }

    public synchronized void f2() {
        ....
    }
}

2개의 쓰레드가 하나의 공통된 A 클래스 인스턴스 a 에 접근할 수 있다고 가정합시다. 2개의 쓰레드중 하나가 a.f1() 을 실행중에 있습니다. 그럼 이 때 나머지 쓰레드에서 a.f2() 를 호출하면, a.f1() 의 실행이 끝나고 난 뒤에 a.f2() 가 실행되는게 보장되나요?? 아니면 그에 상관없이 a.f2() 가 실행되나요?

즉, synchronized 라는 키워드가 해당 메쏘드에 대해서 thread safe 를 보장한다는 것인지, 아니면 해당 객체에 대해서 thread safe 를 보장한다는 것인지... 가 궁금합니다.

익명 사용자의 이미지

synchronized public void method()
{
		...
}

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

위 두 메소드는 사실상 동일합니다. 바이트코드는 다르게 생성되는 것으로 알고 있습니다만 어쨌거나 의미상 같습니다. 즉 말씀하신 상황에서 a.f2() 는 a.f1() 과 동시에 실행되지 않습니다

jongwooh의 이미지

자바는 별로 많이 쓰지는 않지만 제가 알고 있는 부분만 말씀드리자면 syncronized 메소드는 오브젝트 클래스의 인스턴스의 원자성을 보호하는 개념입니다.

즉 거칠게 설명하자면 class c 의 인스턴스 a의 메소드 f1 이 syncronized로 선언되면 같은 클래스의 sync method들은 a.f1()이 끝마쳐 질때까지 a에 대한 접근을 보류합니다.

그러므로 syncronized 메쏘드는 복합 클래스에 남발하면 성능이 많이 떨어질 수 있습니다.

you must know the power of dark side.