SORU
2 ŞUBAT 2011, ÇARŞAMBA


Neden't Java kurucular senkronize edilebilir?

the Java Language Specification, senkronize diğer konuları çünkü işaretli olamaz kurucular göre olamaz nesne parçacığı tamamladı oluşturma kadar oluşturulan bakın. Bu gerçekten başka bir iş parçacığı inşaatı devam ederken nesne görünümü var çünkü biraz tuhaf görünüyor:

public class Test {
    public Test() {
       final Test me = this;
       new Thread() {
           @Override
           public void run() {
               // ... Reference 'me,' the object being constructed
           }
       }.start();
    }
}

Biliyorum ki bu güzel bir örnek yapmacık görünüyor, ama teoride öyle biri olabilir ama bir daha gerçekçi vaka işaretleme kurucu senkronize olur meşru önlemek için yarışları ile ipler gibi bu.

Bu benim sorum: Java özellikle bir kurucu senkronize değiştirici izin vermeyecek bir nedeni var mı? Belki de yukarıda verdiğim örnek hatalı olduğunu, ya da belki de gerçekten bir sebep yok ve keyfi bir tasarım kararı. Her iki durumda da, gerçekten çok merak ediyorum ve cevabını bilmek isterdim.

CEVAP
2 ŞUBAT 2011, ÇARŞAMBA


Eğer sen değil henüz tamamen inşa edilmiş gerçekten neyse sizin için bir referans olur karşı herhangi bir konu, yapıcı geri kalanı eşitlenmesi gereken nesne, a-Blok senkronize kullanabilirsiniz:

public class Test {
    public Test() {
       final Test me = this;
       synchronized(this) {
          new Thread() {
             @Override
             public void run() {
                // ... Reference 'me,' the object being constructed
                synchronized(me) {
                   // do something dangerous with 'me'.
                }
             }
          }.start();
          // do something dangerous with this
       }
    }
}

Genellikle" henüz inşa değil senkronize bir kurucu gerekli değil. yani bu gibi nesne, "vermeyi kabul kötü tarzıdır


Bazı köşe durumlarda senkronize bir kurucu yararlı olacaktır. Burada daha gerçekçi bir örnek, Bozho cevap tartışma:

public class SuperClass {

   public SuperClass() {
       new Thread("evil") { public void run() {
          doSomethingDangerous();
       }}).start();
       try {
          Thread.sleep(5000);
       }
       catch(InterruptedException ex) { /* ignore */ }
   }

   public abstract void doSomethingDangerous();

}

public class SubClass extends SuperClass {
    int number;
    public SubClass () {
        super();
        number = 2;
    }

    public synchronized void doSomethingDangerous() {
        if(number == 2) {
            System.out.println("everything OK");
        }
        else {
            System.out.println("we have a problem.");
        }
    }

}

doSomethingDangerous() Bu yöntem sadece bizim Alt nesne inşaatı tamamlandıktan sonra denir, örneğin sadece "TAMAM" çıktı. her şeyi istiyorum istiyoruz Ama bu durumda, sadece Alt düzenleyebilir, bu ulaşma şansları yoktur. Eğer yapıcı senkronize olabilir, sorun çözülürdü.

Peki, ne öğrenmek hakkında: hiç yapmadığım bir şey yaptım burada üst sınıf yapıcı, sınıf değil, son ve deme olmayan herhangi bir nihai yöntemleri kendi sınıfındaki yapıcı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • George McCarron

    George McCar

    29 Mayıs 2013
  • natescamp

    natescamp

    30 NİSAN 2009
  • Viktorija A.

    Viktorija A.

    28 Mart 2009