, bölüm 3.2.1 "Güvenli Yapıcı Uygulamaları", yapıcı başka konuya this
sızıntı karşı bir uyarı var "yayın yapıcısı son deyimi olsa bile." Bu son kısım benim için çok güçlü görünüyor ve hiçbir gerekçe olmadan sağlanıyor. Yapımdan sonra, kaçınmak için çok dikkatli olmamız gereken şey nedir? İstisnalar var mı? İlgileniyorum çünkü kısa bir süre önce bu şeyi yaptığım bazı kodları gönderdim ve geri dönüş ve refakatçinin gerekip gerekmediğine karar vermek istiyorum. Sen herhangi bir noktada bir yapıcı gelen this
sızıntısı aslajava: Neden bu kurucudan kaçmasına izin verilmemelidir? JCIP yılında
cevap
Bildiğim kadarıyla Java bellek modeli ile ilgili olarak, yapıcı çıkış dolayısıyla bir açıklama öncesinde veya yapıcı çıkışından sonra olup olmadığını fark var, nihai saha semantik bir rol oynar.
This works This doesn't work
-------------------------------------------------------------
static Foo shared; static Foo shared;
class Foo class Foo
{ {
final int i; final int i;
Foo() Foo()
{ {
i = 1; i = 1;
shared = this;
} }
} }
shared = new Foo(); new Foo();
:;
2 örnekler arasındaki tek fark, daha önce veya yapıcı çıkışından sonra shared
atayan (Not. Yayın veri yarış yoluyla shared
uçucu değildir). İkinci örnekte, atama işleminden sonra i=1
yeniden düzenlenebilir. Bununla birlikte, yayın senkronize bir işlemse, örn. uçucu bir değişken aracılığıyla, o zaman tamam; diğer başlıklar tamamen başlatılmış bir nesneyi gözlemleyecektir; Alanlar final
'a bile sahip değildir. veri ırk (veya veri yarış boyunca bir şey yapıyor) üzerinden
Yayın çok dikkatli akıl gerektiren bir çok zor bir iştir. Veri yarışından kaçınırsanız, işler çok daha basittir. Kodunuz veri yarışması içeriyorsa, kurucu çıkışından hemen önce this
sızması ve yapıcı çıkışından hemen sonra yayınlama arasında fark yoktur.
, "hatta [...] son açıklamada". this
tamamen oluşturulmadığından bazı garip şeyler olabilir. Benzer bir soruda this SO answer'a bakın.
Sen
bir nedeni bunu yapıcı son satırı bile, bunu yapmamalıyız ("this
sızıntı" olarak bilinir) yapıcısı dışına this
geçmesi asla JVM izin olmasıdır Geçerli iş parçacığı üzerindeki etki etkilenmediği sürece ifadeleri yeniden sipariş etmek için. Başka bir iş parçacığında çalışan bir işlem için this
iletilirse, yeniden sıralama, tuhaf ve ince hatalara neden olabilir.
diğer nedeni inşaat sınıf yapıcısı son satırına tam olmayabilir bu yüzden alt sınıfları, kendi başlatma sağlayabilir olmasıdır.
- 1. "?" Nin kaçmasına izin vermenin gerekçesi nedir?
- 2. Neden OCaml'ın List.map dosyasında izin var? şöyle OCaml 3.12.1 yılında
- 3. Java neden tanımlayıcılarında kontrol karakterlerine izin veriyor?
- 4. Bu varsayılan şablon parametresine neden izin verilmiyor?
- 5. Derleyici neden bu fişe izin veriyor?
- 6. Bu Java Kodu Neden ve Nasıl Yapılır?
- 7. Bir filtrenin, taşma gizli olsa bile sınırlardan kaçmasına izin veren bir Safari hatası çevresinde nasıl çalışırım?
- 8. neden görüntümü bu kodla bir daireye kırpmama izin vermiyor?
- 9. Neden bu duruma
- 10. Bu RewriteRule neden çalışmıyor?
- 11. Kalıtsal üyeye neden izin verilmiyor?
- 12. Neden 'constexpr' parametrelerine izin verilmiyor?
- 13. Bu nasıl neden çalışmıyor (`sed?
- 14. GHCi yılında
- 15. Javascript'te yeni ile adlandırılan bir kurucudan null nasıl döndürülür?
- 16. Neden bu istisnayı java kullanarak Google CAlendar kitaplığı ile alıyorum?
- 17. Neden Java bu yöntemi uyguladığımda "getPriority() yöntemini çözemiyor" diyor?
- 18. Bu jenerik neden üst sınıf sınırını (Java) tanımıyor?
- 19. işe bu beklenen neden emin değilim Java ve node.js
- 20. Lateks Lateks yılında
- 21. Bu karakter neden tarayıcımın bozulmasına neden oluyor?
- 22. Java bu uzun değeri
- 23. "Bu" ne demektir. Java
- 24. Java: Envanterimde bırakma eylemine izin veriliyor mu?
- 25. Neden toString() yöntemini varsayılan yöntem olarak eklememize izin verilmiyor?
- 26. Bu neden bir bellek sızdırıyor
- 27. Django yılında
- 28. Neden bazı sayfalara erişmeme izin vermiyor?
- 29. Task.Delay() neden sonsuz bir gecikmeye izin veriyor?
- 30. TDateTimePicker neden Şubat'a gitmeme izin vermiyor?
http://msmvps.com/blogs/jon_skeet/archive/2010/09/02/don-t-let-this-get-away.aspx – SLaks