synchronized에 대해서 -- JSP, SPRING




자바 프로그래밍 시 스레드 프로그래밍을 할 때 동기화의 목적으로 Synchronized를 사용하는데, 이 Synchronized를 제대로 사용하지 못하면 프로그램에 심각한 성능저하가 발생하게 된다.

Synchronized에 대해 주의점을 쓴 글이 있어 참조하여 정리하여 둔다.

public class SynchronizedTest
{
public synchronized void A()
{
System.out.println("Method A");
}
public synchronized void B()
{
System.out.println("Method B");
}
public void C()
{
System.out.println("Method C");
}
}

위와 같이 Synchronized를 사용한다면 한 스레드에서 SynchronizedTest클래스의 인스턴스의 A메소드를 사용할 때 다른 스레드에서는 A메소드만 접근 못하는 것이 아니라 인스턴스에 Synchronize가 걸려 있는 A, B메소드 모두를 진입하지 못한다.

이유는 메소드에 위에처럼 Synchronized를 거는 방식은 아래와 같이 인스턴스를 사용하여 걸기 때문이다.

public void A()
{
synchronized (this)
{
System.out.println("Method A");
}
}

그래서 복수개의 스레드에서 한 스레드가 메소드별로 접근을 제한하려면 아래와 같이 사용해야 한다.

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

static을 사용하면 아래와 같은 효과이다.

public void A()
{
synchronized (SynchronizedTest.class)
{
System.out.println("Method A");
}
}



덧글

댓글 입력 영역