Singleton: İş Parçacığı Güvenli Uygulamalar
Çift denetimli kilitleme, enum veya tutucu kalıbını kullanarak iş parçacığı güvenli bir Singleton oluşturun.
Singleton: İş Parçacığı Güvenli Uygulamalar, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Tekil Örnek Deseni
Tekil örnek, JVM'de bir sınıfın yalnızca bir örneğinin bulunmasını sağlar. Yaygın kullanım alanları şunlardır: yapılandırma yöneticileri, bağlantı havuzları ve günlük kaydı hizmetleri.
Saf Tekil Örnek — İş Parçacığı Güvenli Değil
Klasik tembel tekil örnek, eşzamanlı erişimde başarısız olur: iki iş parçacığı null denetiminden aynı anda geçerek iki örnek oluşturabilir.
public class Config {
private static Config instance;
private Config() {}
public static Config getInstance() {
if (instance == null) { // race condition!
instance = new Config();
}
return instance;
}
}Eşzamanlılaştırılmış Yöntem — Basit ama Yavaş
synchronized ifadesini getInstance() yöntemine eklemek iş parçacığı güvenliği sağlar; ancak örnek oluşturulduktan sonra bile her çağrıda kilitleme yapar ve gereksiz ek yük oluşturur.
public static synchronized Config getInstance() {
if (instance == null) instance = new Config();
return instance;
}Çift Denetimli Kilitleme
Kilit olmadan denetleyin, ardından synchronized bloğunun içinde tekrar denetleyin. Yönergelerin yeniden sıralanmasını önlemek için alanın volatile olması gerekir.
public class Config {
private static volatile Config instance;
private Config() {}
public static Config getInstance() {
if (instance == null) {
synchronized (Config.class) {
if (instance == null) instance = new Config();
}
}
return instance;
}
}Talep Üzerine Başlatma için Holder
En güvenli ve verimli tembel tekil örnek yaklaşımı şudur: özel bir statik iç sınıf örneği tutar. JVM bu sınıfı yalnızca getInstance() ilk kez çağrıldığında yükler; sınıf yükleme doğası gereği iş parçacığı açısından güvenlidir.
public class Config {
private Config() {}
private static final class Holder {
static final Config INSTANCE = new Config();
}
public static Config getInstance() {
return Holder.INSTANCE;
}
}Numaralandırma Tekil Örneği
Effective Java, tek bir sabit içeren bir numaralandırma önerir. Bu yaklaşım kısa, iş parçacığı açısından güvenli, serileştirmeye dayanıklı ve yansıma saldırılarına karşı bağışıktır.
public enum AppConfig {
INSTANCE;
private String apiUrl = "https://api.example.com";
public String getApiUrl() { return apiUrl; }
}
// Usage:
String url = AppConfig.INSTANCE.getApiUrl();Önden Başlatma
Başlangıç maliyeti kabul edilebilirse, örneği sınıf yüklenirken bir static final alanıyla başlatın. Bu yaklaşım basit ve iş parçacığı açısından güvenlidir; ancak örnek hiç kullanılmasa bile her zaman oluşturulur.
public class Config {
private static final Config INSTANCE = new Config();
private Config() {}
public static Config getInstance() { return INSTANCE; }
}Tekil Örnek ve Serileştirme
Serileştirilip ardından serileştirmeden çıkarılan bir tekil örnek, INSTANCE döndüren readResolve() eklemediğiniz sürece yeni bir örnek oluşturur. Numaralandırma yaklaşımı bunu otomatik olarak ele alır.
private Object readResolve() { return INSTANCE; }Tekil Örnek ve Yansıma Saldırıları
Yansıma, özel kurucuları çağırabilir. Bir örnek zaten varsa kurucuda istisna fırlatarak buna karşı koruma sağlayın. JVM belirtimine göre numaralandırma tekil örnekleri bu saldırılara karşı bağışıktır.
private Config() {
if (Holder.INSTANCE != null) {
throw new IllegalStateException("Use getInstance()");
}
}Bağımlılık Ekleme Çerçevelerinde Tekil Örnek
Spring'de bean'ler varsayılan olarak tekil örnektir (@Scope("singleton")). Tekil örnek desenini nadiren kendiniz uygularsınız; bunun yerine DI kapsayıcısının yönetmesine izin verin.
@Component // Spring manages a single instance
public class FeatureFlags {
private final boolean darkMode = true;
public boolean isDarkMode() { return darkMode; }
}Tekil Örnekleri Sınama
Tekil örneklerin birim sınamasını yapmak zordur; çünkü genel durumu taşırlar. Elle yazılmış tekil örnek kodu yerine bağımlılık eklemeyi tercih edin; kurucu üzerinden bağımlılık ekleyerek sınamalarda sahte örnekler verin.
Hızlı Kontrol
Effective Java'da hangi tekil örnek yaklaşımı önerilir?
Özet
İş parçacığı açısından güvenli tekil örnekler için Talep Üzerine Başlatma için Holder veya numaralandırma yaklaşımını kullanın. Saf tembel başlatmadan kaçının. Spring uygulamalarında kapsam yönetimini çerçeveye bırakın.
Yapay zeka eğitmeniyle Java öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 104
- Dersler
- 374
Sıkça Sorulan Sorular
“Singleton: İş Parçacığı Güvenli Uygulamalar” dersi ücretsiz mi?
Evet — “Singleton: İş Parçacığı Güvenli Uygulamalar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Singleton: İş Parçacığı Güvenli Uygulamalar” dersinde ne öğreneceğim?
Çift denetimli kilitleme, enum veya tutucu kalıbını kullanarak iş parçacığı güvenli bir Singleton oluşturun. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Singleton: İş Parçacığı Güvenli Uygulamalar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Singleton: İş Parçacığı Güvenli Uygulamalar
- Fabrika Yöntemi Kalıbı
- Ürün Aileleri için Abstract Factory
- Akıcı API ile Builder Kalıbı