2013-03-04 20 views
5

Aşağıdaki kod neden bir kilitlenmeye neden olmaz? Yani getNumber (.) Adını verdikten sonra sınama nesnesi kilitlenmelidir, bu yüzden getNumber2'ye erişememeliyim (.).Senkronize bir yöntemden eşzamanlı yöntem çağırma, her ikisi de aynı nesnenin

class Test() { 
    synchronized int getNumber(int i){ 
     return getNumber2(i); 
    } 

    synchronized int getNumber2(int i) { 
     return i; 
    } 

    public static void main(String[] args) { 
     System.out.println((new Test()).getNumber(100)); 
    } 
} 

Çıktı:

100 
+0

Benzer mesaj: http://stackoverflow.com/questions/5798637/is-it-safe-to-call-a-synchronized-method-from-another-synchronized-method – Walls

+0

Evet soru onun aynı ama bağlamı oldukça farklı. Bu soru üzerinde, ölü kilit hakkında soru sormaktaydı, diğeri ise ipliği güvenli. – Lovera

cevap

19

Bu kilit aynı iş parçacığı tarafından birden çok kez kazanılmış olabilir, yani yeniden girişlidir çünkü. Java tutorial itibaren

:

evresel Senkronizasyon başka bir kullanımın ait kilit elde edemez

hatırlayın. Ancak bir iş parçacığı zaten sahip olduğu bir kilit alabilir. Bir ipliğin aynı kilidi birden fazla kez almasına izin vermek, reentran senkronizasyonunu mümkün kılar. Bu, senkronize kodun doğrudan veya dolaylı olarak senkronize kod içeren bir yöntemi çağırdığı ve her iki kod kümesinin de aynı kilidi kullandığı bir durumu tanımlar. Yeniden eşzamanlı senkronizasyon olmadan, senkronize kodun, bir iş parçacığının kendisinin engellenmesini önlemek için birçok ek önlem alması gerekir.

JLS ilgili kısmı §17.1. Synchronization geçerli:

Java programlama dili konuları arasında iletişim kurmak için birden mekanizmaları sağlar. Bu yöntemlerin en temelini, monitörler kullanılarak uygulanan senkronizasyon. Java'daki her nesne, bir iş parçacığının kilitleyebileceği veya kilidi açabileceği bir monitörle ilişkilendirilir. Bir seferde sadece bir iplik bir monitörde kilit tutabilir. Bu monitörü kilitlemeye çalışan diğer tüm dişler, bu monitörde bir kilit elde edene kadar engellenir. Bir iş parçacığı t belirli bir monitörü birçok kez kilitleyebilir; her bir kilit açma bir kilitleme işleminin etkisini tersine çevirir.

bunları yapmazsa o olabilir kadar
4
bir iş parçacığı senkronize bir yöntem girerken çünkü çıkmaza yol açmaz

, o zaman, bu this bir kilit sahip olduğunu kontrol ediyor farketmez, bekler kilidi ve al. iplik senin durumunda ikinci synchonized yöntemi girdiğinde

, zaten this nesne üzerinde kilit var, bu yüzden engellemeden yöntemi girebilirsiniz. Buna

İlgili konular