Java senkronizasyonu hakkında SO'ya her soru çıktığında, bazı insanlar synchronized(this)
kaçınılması gerektiğini belirtmek için çok istekli olurlar . Bunun yerine, özel bir referans üzerinde bir kilidin tercih edileceğini iddia ediyorlar.
Verilen nedenlerden bazıları:
- Bazı kötü kodlar kilidini çalabilir (bu çok popüler, ayrıca "yanlışlıkla" bir varyantı var)
- aynı sınıftaki tüm senkronize yöntemler aynı kilidi kullanır, bu da verimi azaltır
- (gereksiz) çok fazla bilgi açığa çıkarıyorsun
Ben de dahil olmak üzere diğer insanlar synchronized(this)
çok kullanılan bir deyim olduğunu (Java kütüphanelerinde de) güvenli ve iyi anlaşıldığını iddia ediyorlar . Kaçınılmamalıdır çünkü bir hatanız var ve çok iş parçacıklı programınızda neler olup bittiğine dair bir ipucunuz yok. Başka bir deyişle: geçerliyse kullanın.
İşi this
yaparken kilitlenmekten kaçınmanın tercih edildiği bazı gerçek dünya örneklerini (foobar şeyler yok) görmekle ilgileniyorum synchronized(this)
.
Bu nedenle: her zaman kaçınmalı synchronized(this)
ve özel bir referanstaki bir kilitle değiştirmeli misiniz ?
Bazı ek bilgiler (cevaplar verildiğinde güncellenir):
- örnek senkronizasyonu hakkında konuşuyoruz
- hem örtük (
synchronized
yöntemler) hem de açık biçimlerisynchronized(this)
dikkate alınır - Bloch'u veya konuyla ilgili diğer yetkilileri teklif ederseniz, sevmediğiniz parçaları dışarıda bırakmayın (örn. Etkili Java, İş Parçacığı Güvenliği öğesi: Genellikle örneğin kendisinin kilididir, ancak istisnalar vardır.)
- Kilitlemenizde
synchronized(this)
sağlar dışında ayrıntıya ihtiyacınız varsa ,synchronized(this)
geçerli değildir, bu yüzden sorun değildir