Single Thread Execution 패턴
19 Nov 2017 | 디자인패턴Single Thread Execution 패턴
Single Thread Execution 패턴은 공통의 오브젝트에 대해 다수의 Thread가 작업을 할 때, 동시에 작업을 하는 것이 아니라 한 번에 하나의 Thread가 대상 오브젝트를 사용할 수 있도록 하는 패턴입니다.
하나의 Thread만 처리가능한 영역을 Critical Section 또는 Critical Region이라고 부릅니다.
Java에서는 synchronized
키워드를 이용해서 쉽게 Critical Section을 만들 수 있습니다.
예제
public class CommonObject { private int id = 0; private String name = "name"; private String address = "address"; public synchronized void setAttribute(int id, String name, String address) { this.id = id; this.name = name; this.address = address; } public synchronized String toString() { return "(id: " + id + ", name: " + name + ", address: " + address + ")"; } }
위와 같은 CommonObject
클래스의 인스턴스는 동시에 여러 개의 Thread가 접근하더라도 각 함수에 대해 오직 하나의 Thread만 접근을 허용합니다.
synchronized와 Lock
만약 특정 Thread가 synchronized
메소드를 실행하게 되면 해당 Thread는 Lock을 획득(Aquire)하게 됩니다. 그리고 해당 메소드를 빠져나가게 되면 Lock을 해제(Release)합니다.
Lock는 각 인스턴스마다 존재합니다. 만약 여러 개의 인스턴스를 생성했을 경우 Lock은 각각의 인스턴스마다 존재하게 됩니다.
주의점
Single Thread Execution 패턴은 다음과 같은 주의점이 있습니다.
- 복수의 Thread간 데드락(Dead Lock)이 발생할 가능성이 높습니다.
- 해당 클래스를 상속할 경우 서브 클래스에 의해 안정성이 무너질 가능성이 존재합니다.
- Lock은 Cost가 많이 드는 작업입니다. 여러 Thread에 의해 충돌이 날 문제가 없는 경우는 Lock을 사용하지 않는 것이 더 좋습니다.
- Thread간 충돌이 발생해서 성능 저하가 됩니다. 하나의 Thread가 Lock을 점유해서 다른 Thread들이 작업을 대기하고 있는 것을 충돌(Conflict)라고 합니다. Lock을 너무 많이 사용하게 될 경우 Multi-Thread 환경의 장점이 사라지고 단일 Thread를 사용한 것보다도 더 안 좋은 성능을 낼 수도 있습니다.