2012-11-21 11 views
5

, 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

+1

http://msmvps.com/blogs/jon_skeet/archive/2010/09/02/don-t-let-this-get-away.aspx – SLaks

cevap

4

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.

4

, "hatta [...] son ​​açıklamada". this tamamen oluşturulmadığından bazı garip şeyler olabilir. Benzer bir soruda this SO answer'a bakın.

4

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.

İlgili konular