[Java] Multithreading - Thread Synchronization (2)

반응형

이번 글에서는 multi threading 환경에서 synchronization을 사용하는 방법에 대해 알아보도록 하겠습니다.

1. Synchronized Keyword

synchronized keyword는 다음 4가지 유형의 blocks에서 사용될 수 있습니다.

• Instance Method
• Static Method
• Instance Method Code Block
• Static Method Code Block

위의 4가지 유형의 특징 및 사용방법은 다음과 같습니다.

1-1) Instance Method

instance method 동기화를 사용하면, instance 별로 동기화를 이루게됩니다.

public synchronized void add(int value) { 
    this.count += value;
}

위와 같이 instance method에 synchronized가 선언된 경우, 인스턴스 메서드의 동기화는 이 메서드를 가진 instnace(객체)를 기준으로 이루어지게 됩니다.

synchronized가 선언된 메서드만 동기화 되는 것이 아닌, 해당 메서드를 소유한 인스턴스별로 동기화 된다는 것에 주의하시면 되겠습니다. 😅

1-2) Static Method

static method 동기화를 사용하면, class 별로 동기화를 이루게됩니다.

public static synchronized void add(int value) { 
    this.count += value;
}

위와 같이 static method에 synchronized가 선언된 경우, 스태틱 메서드의 동기화는 이 메서드를 가진 class(클래스)를 기준으로 이루어지게 됩니다.

JVM 'Method Area'에 클래스 객체는 클래스당 한개만 존재하므로, 같은 클래스에 대해서 오직 하나의 쓰레드만 작업을 수행할 수 있습니다.

1-3) Instance Method Code Block

동기화가 반드시 메서드 전체에 대해 이루어져야 하는 것은 아니므로, 메서드 내부에 동기화 block을 사용해 '필요한' 부분만 동기화 처리할 수 있습니다.

public void add(int value) {
    ...
    synchronized(this) {
        this.count += value;
    }
}

위에서 synchronized block이 객체를 주입받고 있는 것을 확인할 수 있는데, 이때 synchronized block에 전달된 객체를 '모니터 객체(monitor object)'라고 하며 이 모니터 객체를 기준으로 동기화가 이루어지게 됩니다.

위의 예제에서는 this를 전달해 자기자신을 모니터 객체로 전달하고 있으므로, 위에서 살펴본 'Instance Method' 동기화와 같은 역할을 수행합니다.

1-4) Static Method Code Block

static method에 synchronized block은 다음과 같이 사용할 수 있습니다.

public class MyClass { 
    public void add(int value) {
        ...
        synchronized(MyClass.class) {
            this.count += value;
        }
    }
}

추천서적

 

이것이 자바다:신용권의 Java 프로그래밍 정복

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY