Tekli modun özellikleri
Tembel (güvenli olmayan ileti dizisi)
Esas olarak, tekli sınıfın, Lazy Loading'in etkisini elde etmek için somutlaştırılmış bir nesne yaratması gerektiğinde harici olarak somutlaştırılması gerektiği şeklinde kendini gösterir.
Statik getSingleton () yöntemi ve özel izin yapıcısı, başlatılmış bir nesne oluşturmanın tek yolunu sağlar.
Dezavantajlar: Çoklu iş parçacığı dikkate alınmadan, aynı anda birden çok ziyaretçi erişebilir ve birden çok nesne oluşturma sorunu ortaya çıkabilir, bu nedenle bu yöntem çoklu iş parçacığı altında kullanılamaz.
Tembel (iş parçacığı açısından güvenli, eşzamanlı yöntem, önerilmez)
Tembel iş parçacığı güvensizliği göz önüne alındığında, iş parçacığı eşitlemesini sağlamak için getSingleton () için eşitlenmiş kilitlemeyi düşünmek doğaldır.
Yetersiz: düşük verimlilik. Çoğu durumda, bu kilit tarafından kullanılan ekstra kaynaklar boşa harcanır.Her iş parçacığı sınıfın bir örneğini almak istediğinde, getSingleton () yönteminin yürütülmesi senkronize edilmelidir.
Aç Çince (iş parçacığı güvenli)
Sınıf yükleme sırasında nesnelerin örneklenmesi süreci aç bir Çin stilidir.
İş parçacığı senkronizasyon sorunlarını önlemek için, çalışırken bu sınıfı yükleyin ve ardından doğrudan erişin
Dezavantajlar: Aşağıdaki statik iç sınıflarla karşılaştırıldığında, bu yöntemde statik iç sınıflardan daha fazla yerleşik bellek vardır, bu da bellek israfına neden olur ve tembel yükleme etkisine ulaşmaz.
Statik dahili sınıf yükleme (iş parçacığı güvenliği)
Statik iç sınıf, singleton yüklendiğinde yüklenmez ve getSingleton () yöntemi çağrıldığında yüklenir, bu da tembel bir etki sağlar ve aynı zamanda iş parçacığı açısından güvenlidir.
Sınıfın statik özellikleri yalnızca sınıf ilk kez yüklendiğinde başlatılacaktır, bu nedenle yukarıdaki JVM yöntemi iş parçacığının güvenliğini sağlamamıza yardımcı olur.Sınıf başlatıldığında, diğer evreler giremez.
Numaralandırma (iş parçacığı güvenli)
Ücretsiz serileştirme; yalnızca bir örneğe sahip olma garantili; iş parçacığı açısından güvenli.
Etkili Java yazarının savunduğu yöntem neredeyse mükemmeldir ve kalıtım senaryolarında uygulanamaz.
Tembel çift çek kilit yöntemi (genellikle iş parçacığı için güvenlidir, tam güvenlik garanti edilemez)
Senkronizasyon kodu bloklarının kullanılması, ikinci yöntemin verimsizliğini önler, ancak bu yöntem, iş parçacığı senkronizasyonunun rolünü tam olarak oynamaz Yukarıdaki birinci yöntemin neden olduğu soruna benzer şekilde, çok iş parçacıklı erişim sırasında çok sayıda nesne üretilebilir.
Tembel tarzda çift kontrol nihai sürümü (el yazısı önerisiyle görüşme)
Altıncı yöntemden farkı, bu yöntemin tekil ifadeye uçucu anahtar sözcüğünü eklemesi ve böylece iş parçacığı güvensizliğinin düşük olasılığını çözmesidir.
Volatile, komutun yeniden düzenlenmesini engelleme rolünü oynar. Ataması tamamlanmadan önce, okuma işlemi (singleton == null) çağrılmayacaktır.
ThreadLocal (iş parçacığı güvenliği) kullanarak uygulama
ThreadLocal, her iş parçacığı için bağımsız bir değişken kopya sağlar, böylece birden çok iş parçacığının veri erişim çakışmalarını izole eder.
Çok iş parçacıklı kaynak paylaşımı sorunu için, senkronizasyon mekanizması "alan için zaman" yaklaşımını kullanırken, ThreadLocal "zaman için boşluk" yaklaşımını kullanır. İlki yalnızca bir değişken sağlar ve farklı iş parçacığının erişim için sıraya girmesine izin verirken, ikincisi her iş parçacığı için bir değişken sağlar, böylece birbirini etkilemeden aynı anda erişilebilir.
(İş parçacığı güvenliği) elde etmek için CAS kilidini kullanın