SORU
31 Ocak 2013, PERŞEMBE


Değişmezliğini tanıdı ve yeniden

Kabul cevap yorum

Bu soruyu dhave hayal ben woul çok daha fazla ısı üretti. Önemli bir sonuç ben eşzamanlılık ilgi e-posta listesi (aslında bu şeyleri uygulamaya çalışan insanlar yani) üyeleri ile kamu ve özel görüşmelerden çekti

Eğer inter-iplik herhangi bir sonu yok bu sırayla tutarlı bir şekilde yeniden düzenlemeyi olur-daha önce ilişki bulabilirsen, geçerli bir yeniden düzenleme (yani program ile uyumlu sipariş ve nedensellik kuralı gereği).

John Vint cevabı sağlamıştır.


Orijinal soru

Aşağıdaki kod (Uygulamada Java Eşzamanlılık 16,3 ve Listeleme) bilinen nedenlerle iş parçacığı güvenli değil:

public class UnsafeLazyInitialization {
    private static Resource resource;

    public static Resource getInstance() {
        if (resource == null)
            resource = new Resource();  // unsafe publication
        return resource;
    }
}

Ancak birkaç sayfa sonra, bölüm içinde devlet 16,3 ve,:

UnsafeLazyInitialization aslında güvenlidireğerResource değişmezdir.

Bu deyimi anlamıyorum:

  • eğer Resource değişmez ise, herhangi bir iş parçacığı resource değişken gözlem ya bakın bu boş veya tamamen inşa (final alanları Java Bellek Modeli tarafından sağlanan güçlü kendisine teşekkür ederiz)
  • resource iki okur (if okuyup return) yeniden olabilir özellikle. ancak, hiçbir talimat yeniden engeller: Bir iş parçacığı bir sigara if durumda resource boş bkz ama bir null başvuru ( * ) dönebilir.

UnsafeLazyInitialization.getInstance() Resource değişmez ise bile boş dönmek olmaz bence. Ve (ya da neden) neden mi?

Not: yalnızca Evet veya Hayır ifadeleri yerine argumented bir cevap bekliyorum.


(*) daha iyi anlamak için, benim nokta hakkında yeniden düzenlenmesi, this blog post ile Jeremy Manson, kim bir yazarın Bölüm 17 İDEA eşzamanlılık, açıklar String. hashcode güvenle yayınlanan) iyi huylu veri yarışı ve nasıl çıkarılması kullanımı yerel bir değişken olabilir yol hashcode yanlış dönen, 0, nedeniyle olası bir yeniden çok benzer tarif yukarıda

Burada yaptığım şey, yeni bir okuma eklemek için: önce iade karma ikinci okuma. Ne kadar kulağa biraz tuhaf ve imkansız gibi, ilk okuma doğru hesaplanan hash değeri döndürebilir ve ikinci okuma 0 döndürebilir! Bu modeli operasyonların kapsamlı yeniden sağlar, çünkü bellek modeli altında izin verilir. İkinci okuma aslında işlemci ilk önce bu, kodunuzu taşınmış olabilir!

CEVAP
31 Ocak 2013, PERŞEMBE


Burada var sanırım karışıklık yazar kasa yayını ne demektir. Boş olmayan bir Kaynak güvenli yayını atıfta bulundu, ama bu oluyor.

Soru ilginç - kaynak null önbelleğe alınan bir değer vermek mümkün mü?

Evet.

Derleyici gibi çalışmasını yeniden düzenlemek için izin verilir

public static Resource getInstance(){
   Resource reordered = resource;
   if(resource != null){
       return reordered;
   }
   return (resource = new Resource());
} 

Bu sıralı tutarlılık kuralı ihlal etmiyor ama null değer döndürebilir.

Ya bu en iyi uygulama olup olmadığını tartışmaya açıktır ama yeniden bu tür önlemek için kurallar yoktur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • infodirt

    infodirt

    11 Mart 2009
  • John Lynn

    John Lynn

    8 Ocak 2010
  • pilslajt

    pilslajt

    20 HAZİRAN 2008