Giriş: Çok Okunan Mühendislik Uygulamalarında Singleton Deseni

Singleton deseni, yazılım mühendisliğindeki en yaygın kullanılan yaratım tasarım modellerinden biridir. Bir sınıfın sadece bir örneği vardır ve bu örneke küresel bir erişim noktası sağlar.Tek hazırlanan uygulamalarda, tek birtonu uygulamak basit: Yapısal tasarım modelleri yapmak, tek bir örnek yaratılan veya en yoğun şekilde oluşturulan bir statik yöntem sunmaktır. ancak, çoklu hazır mühendislik uygulamaları - bu tür sistemlere erişim için, yüksek frekanslı ticaret platformları, gerçek zamanlı kontrol sistemleri, ve dağıtılmış veri tabanı - problem çok daha karmaşık hale gelir.

Bu makale, en yaygın hataları geliştiriciler, C++ ve C#'de eşdeğer desenler uygulamaktadır ve daha fazla okuma için temel nedenleri açıklar.

Singleton Uygulamalı Ortak Hatalar

Deneyimli geliştiriciler bile eş zamanlı sistemlerde tektonları uygulama yaparken tuzaklara düşebilir. Aşağıda, her biri neden tehlikeli olduklarının bir açıklaması ile.

1. Yapıcı Özellik Yapmamak

Herhangi bir tektonun temeli, dışsal aniasyonu engelleyen özel bir yapıdır.Eğer yapılayıcı erişilebilir (ya da korumalı, veya paket-özel), herhangi bir thread yeni bir örnek oluşturabilir, tekton sözleşmesini kırabilir. Çok hazır kodda, bu, sınıf yeniden yönlendirildiğinde ve yapılabilen bir görünüme sahip olabilir veya sınıf alt sınıflandığında (bir tektonun alt sınıflandırılması) her zaman ilan edilir.

2. Thread Safety'i Savaşmayı Başarısız

Tek hazır bir ortamda, basit bir tembel başlangıçlama iyi çalışır:

public class Singleton {
 private static Singleton instance;
 private Singleton() {}
 public static Singleton getInstance() {
 if (instance == null) {
 instance = new Singleton();
 }
 return instance;
 }
}

Ancak çok hazır bir uygulamada, iki veya daha fazla iplikler şu anda birden fazla durumdaki sonuçlara girebiliyor ve bu durum kendi süzcünü yaratmaya devam ediyor.Her bir konu daha, deseni ihlal ediyor.

3. Proper Synchronization olmadan Lazy İlkizasyonunu kullanarak

Örneğin, işbaşı güvenliği için ihtiyaç duyan geliştiriciler bile senkronizasyonu sıklıkla ekler. Örneğin, tüm [[FONThronization naif.For example, senkronizasyon the entireOSPT:3Con method works but introduce a performance bottleneck:

public static synchronized Singleton getInstance() { ... }

Her çağrı, her çağrıyı elde eder ve kilitleri serbest bırakır, örneğin daha önce yaratılmış olsa bile, bu üst hoşnut senaryolarda, bu yüksek oranda tartışılabilir. daha iyi yaklaşım, [[Ücretsiz kilitleme[Dönemeler altında) iki katına çıkar.

4. Overusing Synchronization

Synchronization birçok formda geliyor: 03.03.2012, [[DÜDÜSÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜN

5.Şerefli:0)Sürekli[Dönemli)

Java, C# ve C++ gibi dillerde (örneğin, CFLT:10 ile), [[Dönetici) anahtar kelime (veya eşdeğer) çok hazırlanmış bir kod olarak doğru görünürlüğün, derleme veya CPU'nun tekrar siparişi vermesi ve bir iplik tarafından yapılan değişiklikler başka bir şekilde görünür olmayabilir.

Thread-Safe Singleton Uygulama için en iyi uygulamalar

Bu tuzaklardan kaçınmak için, bu kanıtlanmış stratejileri takip edin. Her yaklaşım, iş güvenliği, performans ve basitliğe hitap eder.

Özel Yapı ve Statik Instance

İlkleşme stratejisine bakılmaksızın, inşaatçı özel olmalıdır. tekton örneği statik bir alanda depolanmalıdır. Yapıcıyı herhangi bir şekilde açığa çıkarmaz ve sınıfIZLI 12'de Java'da (veyaENFLT:13) alt sınıflamayı önlemek için dikkate alınmalıdır.

Yalnızca gerekli olduğunda senkronizasyon blokları kullanın

tembel başlangıç için, çift kontrolli kilitleme modeli senkronizasyonu azaltır:

public class Singleton {
 private static volatile Singleton instance;

 private Singleton() {}

 public static Singleton getInstance() {
 Singleton result = instance; // Local variable for performance
 if (result == null) {
 synchronized (Singleton.class) {
 result = instance;
 if (result == null) {
 instance = result = new Singleton();
 }
 }
 }
 return result;
 }
}

Bu kodda, senkronize blok dışında kontrol 15'i zaten var olduğunda kilit yükü kaçınır. İç kontrol, yalnızca bir ipliknin örnek oluşturduğunu sağlar.Ücretsiz bellek modelinde ve C# ve C++T: 8'in tam olarak görünür olmasını sağlar.

Eager İlkization

Tekton her zaman gerekli ve yaratım ucuzsa, istekli başlangıçlama en basit thread-güvenli yaklaşımdır:

public class Singleton {
 private static final Singleton INSTANCE = new Singleton();

 private Singleton() {}

 public static Singleton getInstance() {
 return INSTANCE;
 }
}

Sınıf yüklemesi JVM tarafından doğal olarak senkronize edilir, bu nedenle ek bir koordinasyon gerekli değildir. Ancak, bu, kaynak-konstalı sistemlerde istenmeyen veya tekton henüz mevcut olmadığı zaman yapılandırmasına bağlıdır.

Statik Ödeveğe (İnisallaştırma-on-dans)

Bu model, açık senkronizasyon olmadan tembel başlangıçlarını birleştirir:

public class Singleton {
 private Singleton() {}

 private static class Holder {
 static final Singleton INSTANCE = new Singleton();
 }

 public static Singleton getInstance() {
 return Holder.INSTANCE;
 }
}

[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=TRNT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=TRNT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=

Enum-Based Singleton (Java)

Joshua Bloch'sETHFLT:0)Effective Java) bir enum kullanmayı önerir:

public enum Singleton {
 INSTANCE;

 // methods and fields
}

Enum sabitleri kapalıdır.(yalnızca arayüzleri uygular), bu yüzden tüm kullanım vakalarında uygun değildir.

C++ ve C#'de Eşdeğer Desenler

C++'da, [[0)Meyer'in Singleton[Dönetici: 1) C++11'den beri iş yerindedir:

Singleton& getInstance() {
 static Singleton instance;
 return instance;
}

C#, theETHFLT:26) sınıf, yerleşik bir thread-güvenli bir başlangıç sağlar:

public class Singleton {
 private static readonly Lazy<Singleton> _lazy =
 new Lazy<Singleton>(() => new Singleton());

 public static Singleton Instance => _lazy.Value;
}

Mühendislik Uygulamalarında Test ve Değerlendirme

Mühendislik uygulamalarında, tekton modeli genellikle donanım sürücüleri, konfigürasyon ayarları, iplik havuzları veya çoklu hazır testlerde bu tür singletonları test etmek için paylaşılan kaynakları yönetir: Aşağıdakileri göz önünde bulundurun:

  • [FONT:0) Tektonlar test edilebilir[Döneticileri değiştiremezler[Döneticileri değiştiremezler) örneğini sıfırlamanın bir yolu vardır (örneğin, korumalı bir şekilde) veya sadece testlerde kullanılan yöntem, bir arayüzle bağımlılık sağlar. Birçok modern uygulama, yaşam döngüsünü yöneten tektonlardan tamamen yanar.
  • [FONTNT=0]Performance profili[[Dönetici:0) Gerçek zamanlı veya yüksek frekanslı sistemlerde [C++) veya s.
  • [FONT:0]Distributed sistemler[Dönemli:0][Dönemli sistemler[Dönemli:0)Dönemli sistemler[Dönemli sistemler[Dönemli:0)) tektonlar, süreçlerde değil, süreçlerde benzersiz olmak için tektonlar gerektirir.Eğer dışsal bir koordinasyonu kullanın (örneğin, bir veritabanı,Keep Zooer veya lider seçimi).
  • [FONT=0]Reflection and serialization[Dönetici:0)[Döneticileri kırabilir ve Java serileştirmesinde bulunan ve yapıtlı bir istisna atarak yansımayı önleyebilirsiniz.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Singleton modeli, yazılım mühendisinin araç kutusunda değerli bir araç olarak kalır, ancak çok hazır ortamlardaki uygulamaları ayrıntılı olarak dikkat eder.Tarafsız kalıplar ve Java'daki tektonlar, uygunsuz uçucu kullanımlar ve aşırı-senküreselleştirme gibi - daha basit bir şekilde üretilebilir. -gelişenler görev daha da basitleştirebilir. Çift kontrol edilen kilitlenme modeli, statik sahibi model ve enum tabanlı tektonlar her biri güvenlik ve verimlilik sağlam bir denge sunar.

Daha fazla çalışma için aşağıdaki kaynaklara bakınız:

  • [0]Wikipedia: Singleton Desen).
  • [FONT=0)Oracle Java Singleton mph).
  • [0]Çift kontrolli Locking Kırıkdır” Deklarasyonu).
  • [0] Microsoft .NET Singleton Desen).

Sonuçta, en iyi tekton uygulaması, gereksinimleriniz için en basit olan biridir. Şüpheli olduğunda, istekli başlangıç veya statik sahibi model tercih edin ve her zaman içerik altında doğrulığı doğrulamak için eş zamanlı birim testleri yaz.