2014-11-02 16 views
7

Bu sorunun cevabını zaten bildiğimi düşünüyorum, ancak java dizinin durum makinesinin (veya diyagramın) nasıl çalıştığını anladığımdan emin olmak için görüşlerinizi okumak istiyorum.java: Eğer kilitleme işleminden önce daima() her zaman çağrılırsa, bekleyen iş parçacıkları aynı kilidi nasıl alabilir?

hemen önce verilen bir değer döndürmek) (yani Konu A bildirmek çalıştırır Imagine: Konu bir kilit yayınlamadan önce

public class baz{ 

    // Thread B runs this: 
    public synchronized void bar(){ 
     wait(); 
    } 

    // Thread A runs this: 
    public synchronized int foo(){ 
     notify(); 
     return 11; 
    } 
} 

bildirmek() adı verilecek (Vasiyet oluşur "sonra" , 11; deyimiyle) döner. Peki, nasıl, (bekle() yöntemi aracılığıyla) Bu kilidin bir Konu B bekliyor olabilir, hala Konu A tutulur kilidi elde?

) (bekle, Konu B olacaktır çağıran sonra: iplik B kilidi bildirilir zaman henüz Konu A. tarafından piyasaya sürülmedi, Not

Yani ne bu durumun düşünüyorum şudur durumunu 'dan 'a değiştirin. bekleniyor. Bildirimi aldıktan sonra (Konu A bildirmek() yöntemi), Konu B, bekle() den dönecektir Runnable için değişmeyecek ve kilidi elde etmek için deneyin. Kilit henüz Konu A tarafından serbest olmadığından, Konu B nesnenin monitörde bloke Runnable Engellenen için onun durumunu geçmesi edilecektir. Konu A kilidi serbest bırakır sonra Sonunda, Konu B kilidini kazanmak ve Koşu için Engellenen onun durumunu geçecek.

Bu doğru mu? Ya bu soruyla anlamak istiyorum zaten kazanılmış bir kilitle senkronize bir bekle() den döndüren bir konuya ne olduğunu.

cevap

1

Evet, açıklamanız doğru.

Nesnede wait()'u aradığınızda, çağıran evre nesnenin wait set'a eklenir. notify() ied olduğunda, o bekleme kümesinden kaldırılır ve nesne üzerinde a lock action gerçekleştirilir (bu nesne üzerindeki synchronized bloğu içinde bulunur). Bu kilitleme işlemi, tamamlanıncaya kadar mevcut ipliği engelleyecektir, yani. Nesne monitörünü kilitledi.

Bu aynı nesne üzerinde bir synchronized blok girmeye çalışırken iki konu olurdu aynı davranıştır. Erişilecek ilk iş parçacığı, kilitleme nesnesini derhal tamamlayarak nesne izleyicisini kilitler. Diğer iplik, kilit eylemi tamamlanana kadar bloklar, yani. İlk iplikten sonra monitör kilidini açar.

+0

Bu, iade deyiminin kilidi serbest bırakamadığı anlamına mı geliyor? ve sorunun örneği DeadLock olabilir mi? ve senkronize yöntemde return ifadesini kullanmamalıyız? lütfen açıklayabilir misiniz ya da bu kavramlarımı temizleyebilecek bir bağlantı ver. – UnKnown

+0

@UnKnown 'return', kendi başına kilidi serbest bırakmaz.Eğer 'return' ifadesi' senkronize' blok veya metotla görünürse, 'return'in neden olduğu eylemdir, yani. Bu bloğu veya yöntemi bırakarak kilidi serbest bırakacak. –

İlgili konular