디자인 패턴 - 싱글톤 (Singleton)

2021. 4. 1. 09:28개발 관련 학습정리/C#

반응형

Singleton

애플리케이션을 실행한 후 인스턴스를 하나만 생성하여 어디서든 그 인스턴스에
접근할 수 있도록 하는 디자인 패턴


일반적인 싱글톤 패턴의 클래스는 다음 3가지의 요소를 가집니다

  • private 생성자

  • private static 인스턴스 객체

  • public static 객체 반환 함수

    public class Singleton
    {
        private Singleton() { }
    
        private static Singleton _instance;
    
        public static Singleton Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new Singleton();
                }
                return _instance;
            }
        }
    }

    하지만 이럴경우 Single thread 환경에서는 정상적으로 작동하지만,
    Multi thread 환경에서 초기화 관련 문제가 발생합니다.

    그래서 lock 인스턴스를 이용하여 이러한 문제를 해결할 수 있습니다.
    만약 Multi thread 환경에서 사용되는 singleton 패턴일 경우 해당 방법을 통해 thread-safe를 지킬 수 있습니다.



    lock 인스턴스를 활용한 thread-safe singleton

    public class Singleton
    {
        private static Singleton _instance;
        private static readonly object _lock = new object();
    
        private Singleton() { }
    
        public static Singleton Instance
        {
            get
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new Singleton();
                    }
                    return _instance;
                }
            }
        }
    }

    또한 .net 4.0 버전에서 제공하는 System.Lazy<T>을 활용하면 lock 인스턴스 호출을 줄이고
    조금 더 간단하게 singleton을 정의할 수 있습니다.



    Lazy를 이용한 thread-safe singleton

    public class Singleton
    {
        //private 생성자 
        private SomeClass2() { }
    
        //private static 인스턴스 객체
        private static readonly Lazy<SomeClass2> _instance = 
        new Lazy<SomeClass2> (() => new SomeClass2());
    
        //public static 의 객체반환 함수
        public static SomeClass2 Instance { get { return _instance.Value; } }
    }



    참고 자료

    아래 링크는 더 다양한 버전의 싱글톤을 소개하고 있습니다.
    https://csharpindepth.com/articles/singleton

반응형

'개발 관련 학습정리 > C#' 카테고리의 다른 글

디자인 패턴 - Observer Pattern  (0) 2021.04.01
C# 람다 식 Lambda  (0) 2021.01.27
C# Generic  (0) 2021.01.27
C# 추상클래스와 인터페이스  (0) 2021.01.26
C# Delegate  (0) 2021.01.25