[Java] Multithreading - Thread Synchronization (2)
- Java
- 2020. 8. 16.
이번 글에서는 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' 카테고리의 다른 글
[Java] Multithreading - Thread Pool & Executor Service (0) | 2020.08.16 |
---|---|
[Java] Multithreading - Producer & Consumer (0) | 2020.08.16 |
[Java] Multithreading - Thread Synchronization (1) (0) | 2020.08.16 |
[Java] Multithreading - Using Thread (0) | 2020.08.16 |
[Java] Multithreading - Creating Thread (0) | 2020.08.16 |