G.I.S Developer, 개발자 김형준(Dip2K)  
Front Page
Notice | Keyword | Tag | E-Mail | Guestbook | Admin | Write Article   
 
2007/04/29 00:19 2007/04/29 00:19
Singleton Pattern in C#

대다수의 패턴이 그런 것처럼 Singleton Pattern(이하 Singleton) 역시 언어에 독립적인 부분이 많기는 하지만 갑작스레 다소 익숙치 않은 C#으로 Singleton을 구현할 필요가 생겨 하나의 템플릿의 목적으로 작성해 놓는다.

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}
Singleton은 클라이언트 측에서 오직 하나의 Instance만을 생성하도록 제한해야 하므로 임으로 클라이언트가 생성하지 못하도록 생성자를 private로 선언하고 있음을 알 수 있다. 대신 Instance를 C#의 편리한 Property 문법을 사용해서 만들고 이를 통해 오직 하나의 Instance만을 만든다. Instance Propery의 get의 구현을 보면 static으로 선언된 자신의 클래스 타입인 instance 변수가 null인 경우, 즉 생성되지 않은 경우 단 한번 생성해 주고 반환하고 있음을 알 수 있다. 한번 생성된 경우라면 생성과정 없이 그저 반환만 이루어진다. 다른 Pattern에 비해 그 목적과 구현하는 것에 어려움이 없을 것이다. 하지만 한발작 더 접근해서 Multi Thread 환경에서 Singleton을 바라보면 오류의 근원이나 다름없다. 즉 여러개의 Thread에서 Singleton 클래스를 사용할 경우 충돌이 생긴다. 이유는 단 하나의 인스턴스 변수를 여러개의 스레드에서 사용하려 하기 때문이다. 고속화된 CPU나 Singleton 클래스가 무척 작은 코드조각이라면  충돌에의한 오류가 발생 확률이 다소 줄겠지만, 여전이 충돌 확율은 높다. 이에 대한 개선된 코드가 다음과 같다.

public class Singleton
{
   private static Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         lock (syncRoot) {
             if (instance == null) 
             { 
                 instance = new Singleton();

             }

             return instance;
          }
      }
   }
}
lock이라는 C#의 예약어를 사용함으로써 Critical Section을 만들어 주고 있다. 이 섹션 구간의 코드들은 원자성을 갖게 되어 오직 단 하나의 스레드만이 이 구간의 코드를 연속적으로 실행하는 것을 보장하게 된다. 
이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*

Track this back : http://www.gisdeveloper.co.kr/trackback/230
Commented by typhoon at 2007/12/19 20:31  r x
퍼가두 될까요??
Commented by 김형준 at 2007/12/20 01:48  r x
네, 출처만 잘 표시해주시면 좋겠습니다~
Commented by 이동인 at 2008/12/08 19:40  r x
오 감사합니다.
Commented by 김형준 at 2008/12/09 11:38  r x
댓글에 힘이 팍팍~ ^^*

[로그인][오픈아이디란?]
name    password    homepage
 hidden
BLOG main image
 Notice
[DuraMap-Xr] 소개 및 다운로드
[DuraMap-Xr] FAQ
개발과 관련한 질문은..
OpenGL Tutorials
운영자(Dip2K)에 대해
 Category
전체 (387)
GIS 개발 (82)
프로그래밍 (180)
스치는 생각들 (116)
번역 또는 집필 (3)
 TAGS
GIS OpenGL Shader Xr Algorithm Map Engine WPF ArcObjects ArcGIS C++
 Calendar
«   2010/07   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
 Recent Entries
XrGeocoder - 주소를 좌표... (1)
XrProjection, 좌표계 변... (19)
[Java] 파생 클래스가 아...
[Java] 정적 초기화 블럭(...
[DuraMap-Xr] 그리드 레이...
 Recent Comments
감사합니다!!! 이렇게 직...
김지훈 - 07/29
감사 감사~ 근데.. 이글은...
김형준 - 07/29
친절한 해석 감사드려요^^
안토니오 - 07/29
별말씀을요.. ^^ 댓글에...
김형준 - 07/28
최근에 XrGeocoder라는 툴...
김형준 - 07/28
네, 요즘은 바로 도움을...
김형준 - 07/28
이래 저러 경황이 없어 댓...
김형준 - 07/28
잘 봤습니다. 큰 도움이...
gekko - 07/27
혹시 주소를 좌표로 변환...
김지훈 - 07/25
감사드립니다.. 바빠서 몇...
임은섭 - 07/23
 Archive
2010/07
2010/06
2010/05
2010/04
2010/03
2010/02
2010/01
2009/12
2009/11
2009/10
2009/09
2009/08
 Link Site
Adobe Flex 3 Help
Cartograph 2.0
GIS 위키디피아
GIS 프로그래밍 연구소
MapTools.org
OGC
OGRE3D
OSGeo 한국 지부
Wikipedia
국가수자원관리 정보시스템
국립지리원
국토연구원
국토해양부
네이버 과학
대한측량협회
류광님의 블로그
비지니스 GIS
이민파님의 공간분석과 리...
 Visitor Statistics
Total : 659265
Today : 81
Yesterday : 451
태터툴즈 배너
rss