ProgramlamaBackend geliştirici (VB.NET)

Visual Basic'de Singleton tasarım kalıbı nasıl uygulanır, çok iş parçacıklı güvenlik için nelere dikkat etmek gerekir ve klasik ile tembel (lazy) uygulama arasındaki fark nedir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Singleton tasarımı, bir sınıfın yalnızca bir örneğinin olmasını garanti eder ve ona global bir erişim noktası sağlar. VB.NET'te genellikle özel bir yapıcı ve tek bir örneği saklamak için statik bir özellik kullanılır:

Public Class Singleton Private Shared _instance As Singleton Private Sub New() ' Özel yapıcı 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

Çok iş parçacıklı güvenlik: Çok iş parçacıklı bir ortamda, eşzamanlı erişim sırasında iki örneğin oluşturulması mümkündür. Çözüm: kilitleme veya Lazy(Of T) yapısını kullanmak:

' Tembel çok iş parçacıklı güvenli uygulama 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

Fark:

  • Klasik Singleton, ilk erişimde örneği oluşturur ancak manuel senkronizasyon gerektirir.
  • "Tembel" variant, örneği çok iş parçacıklı modda oluşturmak için .NET'in yerleşik mekanizmalarını kullanır.

Daha karmaşık bir soru.

Aşağıdaki kod Singleton uygulaması için neden tehlikeli?

Public Shared ReadOnly Property Instance() As Singleton Get If _instance Is Nothing Then _instance = New Singleton() End If Return _instance End Get End Property

Cevap: Çok iş parçacıklı bir ortamda, iki iş parçacığı aynı anda _instance'ın Nothing olduğunu görebilir ve her ikisi de nesneyi oluşturabilir. Bu nedenle, bu yaklaşım tamamen çok iş parçacıklı güvenli değildir. Lazy(Of T) veya SyncLock kullanarak kilitleme önerilir.

Konuyla ilgili ince detayların eksikliğinden kaynaklanan gerçek hata örnekleri.


Hikaye

ERP sistemi: Singleton logger, servislerden çalıştırıldığında bazen iki kez oluşturulmuş, loglar kaybolmuştur. Sebep - özellikte senkronizasyon eksikliğiydi, uygulama çok iş parçacıklıydı.


Hikaye

Windows Forms uygulaması: Projede veritabanı işlemlerini Singleton'a taşıdılar, ama tembel başlangıcı uygulamadılar. Uygulama başlarken ağır bir bağlantı yapıldı, bu da tüm kullanıcılar için UI'nin yüklenmesini yavaşlattı.


Hikaye

Gazetecilik platformu eklentisi: Singleton için çok iş parçacıklı erişime karşı korunaksız bir modülde statik değişken kullanmaya çalıştılar, bu da yoğun yük altında email bülten yöneticisinin birden fazla örneğinin ortaya çıkmasına neden oldu ve bu da çoğaltılmış e-postalara yol açtı.