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.
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
@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. –