SORU
4 Mayıs 2014, Pazar


Neden “senkronize” Java 8'de İzin Verilmiyor arabirim yöntemleri nedir?

Java 8, ben kolayca yazabilirsiniz:

interface Interface1 {
    default void method1() {
        synchronized (this) {
            // Something
        }
    }

    static void method2() {
        synchronized (Interface1.class) {
            // Something
        }
    }
}

Ayrıca sınıflarda kullanabileceğim tam senkronizasyon mantığı alacağım. Edemem, ancak, yöntem bildirimleri synchronized değiştirici kullanın:

interface Interface2 {
    default synchronized void method1() {
        //  ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
    }

    static synchronized void method2() {
        // ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
    }
}

Şimdi, bir iki arayüz Interface2 kurar dışında aynı şekilde davranır savunuyorlarsözleşmemethod1() Interface1 ne daha biraz daha güçlü olan method2(),. Tabii ki, aynı zamanda default uygulamaları somut uygulama durumu hakkında herhangi bir varsayım yapmak gerektiğini, ya da bu tür bir anahtar kelime sadece ağırlığını bile kıpırdatmaz iddia edebiliriz.

Soru:

Genel amaçlı-335 uzman grubu arabirim yöntemleri synchronized destek vermeme kararı aldı sebebi nedir?


Bu soruyu hevesle kapatılmadan önce not: Yığın Taşması sığdırmak için Q&A formatı: yetkili alıntılar sadece, spekülasyon değil. arıyorum Bu soruya bir yetkili cevap muhtemelen birçok ziyaretçi gelecek bu soru, lütfen yardım edecektirbu hevesle kapatmayın.

CEVAP
5 Mayıs 2014, PAZARTESİ


Bu bilinçli bir karar, bir eksiklik olarak başka bir yerde ileri sürülmüştür.) ziyade edildi İlk başta bir varsayılan yöntemleri synchronized değiştirici destek istemesi bariz görünebilir, ancak bunu yapmak çok tehlikeli olduğu da ortaya çıkıyor, ve bu yüzden yasaklandı.

Senkronize yöntemleri ise tüm vücut alıcısı olan synchronized bir blok içine alınmış gibi davranan bir yöntemi için bir kısaltma. Mantıklı varsayılan yöntem bu semantiği de genişletmek görünebilir; sonuçta, bir alıcı da örnek yöntemleri. (synchronized yöntemleri tamamen sözdizimsel bir optimizasyon; ihtiyaç yok, sadece ilgili daha kompakt olduğunu not synchronized blok. Orada makul bir argüman için yaptı bunu erken sözdizimsel optimizasyon ilk başta, ve senkronize yöntemleri neden daha fazla sorun daha çözmek, ama o gemi kalktı çoktan.)

Neden tehlikeli? Eşitleme kilitleme. Kilitleme durumu değişken için paylaşılan erişim koordine etmek. Her nesne değişkenleri hangi devlet görevlisi kilitleri belirleyen bir senkronizasyon politikası olması gerekir. (Bkz: Java Concurrency in Practice bölüm 2.4.)

Çok sayıda nesne eşitleme ilkesi olarak kullanınJava Desen İzleyin(JCiP 4.1) bir olan, nesnenin durumu kendi içsel kilit tarafından korunuyor. Hiçbir şey bu model hakkında sihirli ya da özel var, ama rahat ve yöntemleri synchronized anahtar kullanımı dolaylı olarak bu modeli varsayar.

Bu nesnenin eşitleme politikası belirlemek için alır devlet sahibi olan sınıftır. Ama arayüzleri içine karıştırılır, nesnelerin durumunu kendi yok. Öyle bir yöntem kullanarak senkronize bir arayüz varsayar belirli bir eşitleme politikası, ama hangisi size makul bir temeli varsayarsak, bu yüzden belki iyi olması durumunda kullanmak için senkronizasyon sağlar ek bir iş parçacığı güvenliği ne olursa olsun (olabileceğini senkronize yanlış kilit). Bu iş parçacığı güvenliği hakkında bir şey yaptın güven yanlış şekilde, ve hiçbir hata iletisi yanlış eşitleme politika olduğunu söyler.

Zaten yeterince tutarlı bir şekilde tek bir kaynak dosyası için bir eşitleme politikası korumak için; Alt sınıf doğru eşitleme politikası üst sınıf tarafından tanımlanan uygun olmasını sağlamak için daha da zordur. Çok gevşek gibi sınıflar arasında yapmak (uygulamak bir arabirim ve muhtemelen birçok sınıflar) çalışırken neredeyse imkansız ve hata olasılığı yüksek olacaktır.

İçin argüman olur ne bu tartışmalar karşı verilen? Çoğunlukla arayüzleri özellikleri gibi davranır yapmak üzereler gibi görünüyor. Bu tasarım merkezi arayüzü evrim anlaşılabilir bir istek ise,"--". Özellikleri değil İki tutarlı bir şekilde elde edilebileceği, bunun için çabaladı, ama diğeri ile çatışma içinde olduğu, birincil tasarım hedefi lehine bir seçim yapmak zorunda kaldık.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Creavite

    Creavite

    8 Mart 2009
  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • YouChewBu

    YouChewBu

    26 Ocak 2009

İLGİLİ SORU / CEVAPLAR