2014-10-29 17 views
6

Java'mdan fırça alıyorum, bu soruyu bir alıştırmada sordum. Aşağıdakiler bir çıkmazda nasıl sonuçlanabilir?Bu nasıl bir kilitlenme yaratabilir?

private Object sync = new Object(); 

    public void methodA() throws InterruptedException { 
     synchronized(this.sync) { 
      Thread.sleep(1000); 
     } 
    } 

    public void methodB() throws InterruptedException { 
     synchronized(this.sync) { 
      this.methodA(); 
     } 
    } 

Benim tahminim Thread.sleep fonksiyonu gidiyor ederken Yöntemib Yöntemia çağırırsa, iki yöntem basamaklı başlatmak ve belirsiz bir uyku neden olur bu?

Düşünceler?

cevap

9

Hayır, bu bir kilitlenme neden olmaz.

kilitlenme oluşturmak için, iki Thread s a ve b ve iki kaynaklar x ve y gerekir. a, x üzerinde bir kilit tutuyorsa ve y üzerinde bir kilitlemeye de gereksinim duyarsa, b, y üzerinde bir kilidi ve ayrıca x numaralı kilit üzerinde bir kilitleme gerektiriyorsa bir kilitlenme oluşur.

Burada kilitlenecek tek bir şey var, this.sync, bu nedenle kilitlenme oluşmaz.

Başka bir iş parçacığı methodA olarak adlandırılırken methodB girilirse, devam etmeden önce methodA kilidi serbest bırakana kadar bekler. Başka bir iş parçacığı methodB olarak adlandırılırken methodA girilirse, devam etmeden önce methodB kilidi serbest bırakana kadar bekleyecektir. methodB'un methodA numarasını çağırması gerçeği önemli değil, çünkü aynı kilitleme this.sync. iplik zaten kendisi tarafından bloke almaz kilit,

şimdi o odanın içinde özgür bir odada kendini kilitlemek olarak hayal satın aldı eğer

+0

Cevabınız için teşekkürler. Bunu biraz daha iyi anlamaya başladım. Yine de başka bir sorum var, ama SO'ya rastgele şeyler göndermeye devam etmek istemiyorum. Doğrudan ulaşabiliyor musunuz? Yardım için çok teşekkürler. – matcartmill

6

Hayır kilitlenme, o Reentrant Synchronization denir ve kilitli ve kilitli ve kilitli olan diğer odalar odanızdan, odanızı kullanmak isteyen diğer insanlar (dişler) (yöntem) engellenir, siz değil

İlgili konular