synchronized에 대해서

-- JSP, SPRING 2017. 8. 3. 12:48
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

자바 프로그래밍 시 스레드 프로그래밍을 할 때 동기화의 목적으로 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");
}
}


posted by 어린왕자악꿍