SORU
6 Mayıs 2010, PERŞEMBE


Neden beklemeniz gerekir() her zaman senkronize block

Hepimiz Object.wait(), çağırmak için çağrı senkronize blok yerleştirilmesi gerekir, aksi takdirde IllegalMonitorStateException atılır bir. Amabu kısıtlama yapma nedeniniz nedir?wait() monitör, ama neden açıkça blok senkronize belirli yaparak monitör almak ve wait() arayarak izlemek serbest bırakın gerekiyor mu? bültenleri biliyorum

Eğer senkronize bir blok dışında wait() çağırmak mümkün, anlambilim - arayan iş parçacığı askıya olduğunu unutmamak olsaydı potansiyel zarar nedir?

CEVAP
6 Mayıs 2010, PERŞEMBE


Eğer senkronize bir blok dışında wait() çağırmak mümkün, anlambilim - arayan iş parçacığı askıya olduğunu unutmamak olsaydı potansiyel zarar nedir?

Hadi wait() denilebilir eğer rastlayacağımıza ne ile senkronize bir blok dışında göstermeksomut bir örnek.

Engelleme bir sıra (ben, zaten API içinde bir tane var :) uygulamaya geçtiğini düşün

İlk deneme (eşitleme olmadan bir şeyler aşağıdaki satırları boyunca bak

class BlockingQueue {
    Queue<String> buffer = new LinkedList<String>();

    public void give(String data) {
        buffer.add(data);
        notify();                   // Since someone may be waiting in take!
    }

    public String take() throws InterruptedException {
        while (buffer.isEmpty())    // don't use "if" due to spurious wakeups.
            wait();
        return buffer.remove();
    }
}

Bunun ihtimali nedir:

  1. Tüketici bir iş parçacığı take() aramalar ve buffer.isEmpty() görür.

  2. Tüketici iplik arama yapmadan önce wait(), yapımcı bir konu geliyor ve 12**, buffer.add(data); notify(); tam çağırır

  3. Tüketici iplik şimdi wait() çağrı edecektirBayansadece çağrıldı notify()).

  4. Şanssız, üretici tüketici iş parçacığı iş parçacığı hiçbir zaman uyanır gerçeğinin bir sonucu olarak 16 ** daha fazla üretmek olmaz, ve ölü bir kilit var.

Sorunu anladığınızda, çözüm belli: her Zaman 17*/notify *ve 19*/wait *atomik gerçekleştirin.

Detaylara girmeden: Bu eşitleme sorun evrenseldir. Michael Borgwardt belirttiği gibi,/haber bekle evreler arasındaki iletişim, her zaman bir yarış durumu yukarıda açıklanan benzer ile bitireceğiz. Bu yüzden "sadece senkronize içinde" kuralı uygulanır. bekle


link posted by @Willie bir paragraf oldukça iyi özetler:

Garson ve bildirim koşulunu durumu hakkında aynı fikirde mutlak bir garanti gerekir. Garson biraz uyumaya gitmeden ÖNCE bir noktada yüklem durumunu kontrol eder ama baz doğruluğu için uyku durumuna geçer ZAMAN doğru değişir. Program sonu olan bu iki olay arasında açık bir dönem var.

Üretici ve tüketici üzerine kabul etmek gerekir ki bu yüklem yukarıdaki örnekte buffer.isEmpty(). Ve anlaşma bekleyip haber synchronized blok gerçekleştirilen sağlayarak giderilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS

    ASUS

    22 EKİM 2005
  • Felice Musique

    Felice Musiq

    22 NİSAN 2014
  • Grace Su

    Grace Su

    6 Ocak 2006