싱글턴 패턴은 클래스의 인스턴스가 단 하나만 존재하도록 보장하고, 이에 대한 전역 접근 지점을 제공합니다. VB.NET에서는 일반적으로 비공식 생성자와 정적 속성을 사용해 단일 인스턴스를 저장합니다:
Public Class Singleton Private Shared _instance As Singleton Private Sub New() ' 비공식 생성자 End Sub Public Shared ReadOnly Property Instance() As Singleton Get If _instance Is Nothing Then _instance = New Singleton() End If Return _instance End Get End Property End Class
스레드 안전성:
멀티 스레드 환경에서는 동시 접근 시 두 개의 인스턴스가 생성될 수 있습니다. 해결책: 잠금 또는 Lazy(Of T) 구조를 사용합니다:
' 지연 스레드 안전한 구현 Public Class Singleton Private Shared ReadOnly _instance As New Lazy(Of Singleton)(Function() New Singleton()) Private Sub New() End Sub Public Shared ReadOnly Property Instance() As Singleton Get Return _instance.Value End Get End Property End Class
차이점:
다음과 같은 코드가 싱글턴 구현에 대해 위험한 이유는 무엇인가요?
Public Shared ReadOnly Property Instance() As Singleton Get If _instance Is Nothing Then _instance = New Singleton() End If Return _instance End Get End Property
답변: 멀티 스레드 환경에서 두 개의 스레드가 동시에 _instance가 Nothing 인 것을 보고 둘 다 객체를 생성할 수 있는 상황이 발생할 수 있습니다. 따라서 이러한 접근 방식은 완전히 스레드 안전하지 않습니다. Lazy(Of T) 또는 SyncLock을 사용하여 잠금을 권장합니다.
사례
ERP 시스템: 서비스에서 시작할 때 Singleton 로거가 두 번 생성되어 로그가 손실되었습니다. 원인은 속성에서 동기화 부족이었습니다. 애플리케이션은 멀티 스레드 환경이었습니다.
사례
윈도우 폼 애플리케이션: 데이터베이스 작업을 Singleton으로 분리했지만 지연 초기화를 구현하지 않았습니다. 애플리케이션 시작 시 무거운 연결이 발생하여 모든 UI 로딩 속도가 느려졌습니다.
사례
저널리즘 플랫폼 플러그인: Singleton용 모듈 내에서 스레드 안전성을 고려하지 않은 정적 변수를 사용하려고 시도한 결과, 부하가 높은 상태에서 이메일 발송 처리기의 여러 개체가 생성되어 중복 이메일이 발생했습니다.