Thread-Safe Singleton
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 52 / 70.
Singleton deseni, bir sınıfın uygulamanız boyunca yalnızca bir örneğe sahip olmasını sağlar ve bu örneğe küresel bir erişim noktası sunar. Bu, yapılandırma ayarları, günlükleme servisleri veya veritabanı bağlantıları gibi paylaşılan kaynakları yönetmek için kullanışlıdır.
Temel bir Singleton, dışarıdan örnek oluşturulmasını engellemek için özel bir oluşturucu ve erişim sağlamak için statik bir özellik kullanır:
public class Logger
{
private static Logger _instance;
private static readonly object _lock = new object();
private Logger() { } // Özel yapıcı
public static Logger Instance
{
get
{
lock (_lock)
{
if (_instance == null)
_instance = new Logger();
return _instance;
}
}
}
public void Log(string message) => Console.WriteLine(message);
}lock ifadesi iş parçacığı güvenliğini sağlar; birden fazla iş parçacığı Instance öğesine aynı anda erişmeye çalışırsa, kritik bölüme aynı anda yalnızca biri girebilir. Bu olmadan, iki iş parçacığı da _instance değerini null olarak görebilir ve ayrı örnekler oluşturabilirdi.
C#, statik başlatmayı kullanarak iş parçacığı güvenliğinde daha basit bir yaklaşım sunar:
public class Logger
{
private static readonly Logger _instance = new Logger();
private Logger() { }
public static Logger Instance => _instance;
public void Log(string message) => Console.WriteLine(message);
}Bu sürüm iş parçacığı açısından güvenlidir çünkü CLR, statik alan başlatılmasının yalnızca bir kez gerçekleşmesini garanti eder. Her iki yaklaşım da her zaman aynı örneği almanızı sağlar:
Logger.Instance.Log("First call");
Logger.Instance.Log("Same instance");Görev
KolaySingleton desenini kullanarak iş parçacığı güvenli bir yapılandırma yöneticisi oluşturalım. Gerçek uygulamalarda yapılandırma ayarlarına programın tamamı boyunca erişilebilmesi ve yalnızca bir örneğin bulunması gerekir; Singleton bunun için mükemmel bir kullanım alanıdır.
Kodunuzu iki dosyaya ayıracaksınız:
ConfigManager.cs:ConfigManagerad alanında Singleton desenini uygulayan birConfigurationsınıfı oluşturun. Yapılandırma yöneticiniz şunları yapmalıdır:- Tek örneği tutacak özel bir statik alana sahip olmalı
- Dışarıdan örnek oluşturulmasını engellemek için özel bir oluşturucu kullanmalı
- Tek örneği döndüren statik bir
Instanceözelliği sağlamalı (iş parçacığı güvenliği için daha basit statik başlatma yaklaşımını kullanın) _appNamedeğeriyle başlatılan özel bir string alanı"MyApp"içermeli- Uygulama adını güncellemek için bir
SetAppName(string name)yöntemine sahip olmalı - Geçerli uygulama adını döndüren bir
GetAppName()yöntemine sahip olmalı
Program.cs: Ana dosyanızda, örneğe birden çok kez erişerek ve değişikliklerin tüm başvurular arasında korunduğunu göstererek Singleton'ın doğru çalıştığını kanıtlayın.
Bir girdi alacaksınız:
- Ayarlanacak yeni uygulama adı (örneğin,
ProductionServer)
Programınızda:
ConfigManagerörneğini alın ve varsayılan uygulama adını yazdırın- Örneği tekrar alın (farklı bir değişkene) ve girdiden gelen yeni uygulama adını ayarlamak için kullanın
- Örneği üçüncü kez alın ve tüm başvuruların aynı verileri paylaştığını kanıtlamak için uygulama adını yazdırın
Örneğin, girdi ProductionServer ise çıktı şu şekilde olmalıdır:
MyApp
ProductionServerBu, Singleton'ın temel faydasını gösterir: Instance öğesine kaç kez erişirseniz erişin, paylaşılan duruma sahip aynı nesneyi alırsınız. Statik başlatma yaklaşımı iş parçacığı güvenliğini garanti eder; çünkü CLR, birden çok iş parçacığı aynı anda erişse bile statik alanın yalnızca bir kez başlatılmasını sağlar.
Kendin dene
using System;
using Configuration;
class Program
{
public static void Main(string[] args)
{
// Girdiyi oku - yeni uygulama adı
string newAppName = Console.ReadLine();
// TODO: ConfigManager örneğini al ve varsayılan uygulama adını yazdır
// TODO: Örneği tekrar al (farklı bir değişkene) ve yeni uygulama adını ayarlamak için kullan
// TODO: Örneği üçüncü kez al ve tüm referansların aynı veriyi paylaştığını kanıtlamak için uygulama adını yazdır
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi