SORU
2 AĞUSTOS 2011, Salı


Senkronizasyonu olmayan son alan

Bir uyarı olmayan son sınıf sahasına ... senkronize her zaman gösteriyor. İşte kod:

public class X  
{  
   private Object o;  

   public void setO(Object o)  
   {  
     this.o = o;  
   }  

   public void x()  
   {  
     synchronized (o) // synchronization on a non-final field  
     {  
     }  
   }  
 } 

aşağıdaki şekilde.. kodlama değiştirdim

 public class X  
 {  

   private final Object o;       
   public X()
   {  
     o = new Object();  
   }  

   public void x()  
   {  
     synchronized (o)
     {  
     }  
   }  
 }  

Yukarıdaki kodu olmayan son sınıf alanını eşitlemek için doğru yol olduğundan emin değilim. Nasıl olmayan nihai bir alan senkronize edebilir miyim?

CEVAP
2 AĞUSTOS 2011, Salı


Öncelikle, gerçekten de daha yüksek bir düzeyde eşzamanlılık sorunları ile başa çıkmak için zor denemek için teşvik ediyoruz, yani ExecutorServices, Callables, Vadeli işlemler gibi java.util.concurrent sınıfları kullanarak çözme

Bu varlık bir şey yok dediyanlışnihai olmayan bir sahada tek başına eşitleniyor. Sadece akılda tutmak gerekireğer nesne başvurusu değişirse, aynı kod bölümüne paralel olarak çalışabilir. I. e., bir iş parçacığı eşzamanlı bloktaki kodu çalıştırır ve birisi setO(...), ararsa başka bir iş parçacığı çalıştırabiliraynısenkronize blok üzerindeaynı andaaynı anda.

Senkronize hangi özel erişim (veya bir nesne "" ihtiyacınız olanlar için özel erişim). koruma ihtiyacınız olan her nesne Eğer bu sınıfın çeşitli alanları içeriyorsa, tasarım yeniden gözden geçirmek ve belki de soyut bir düzeyde tanıtmak isteyebilirsiniz.

(@Tarafından önemli noktalar Jon Skeet aşağıda dikkatle okuyun :-)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • chickenby

    chickenby

    2 HAZİRAN 2008
  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • FOSDEM

    FOSDEM

    13 Ocak 2009