2014-01-28 49 views
5

假設這個代碼擴展類synchronized方法鎖定

class A 
{ 
    public synchronized void methodA() 
    { 
     // ... 
    } 
} 

class B extends A 
{ 
    @Override 
    public synchronized void methodA() 
    { 
     // ... 
     super.methodA(); 
    } 
} 

應由如果它想通過super.methodA()訪問B類和超A級的了methodA功能了methodA任何線程獲得什麼鎖?

回答

2

A​​方法相當於一個方法,它的主體包裹在一個synchronized(this)塊中。因此,這樣的:

public synchronized void methodA() 
{ 
    // ... 
} 

是一樣的:

public void methodA() 
{ 
    synchronized(this) { 
     // ... 
    } 
} 

現在,你可以很容易地看到,無論methodA實現鎖定同一對象,即this對象。也就是說,如果線程在超類的​​方法中,它也阻止其他線程進入子類的任何​​方法(反之亦然)。

由於​​鎖是可重入的,所以成功輸入B.methodA意味着您也可以立即輸入super.methodA(因爲您已經擁有該鎖)。

3

當您致電B b = new B(); b.methodA();當前線程將鎖定b,輸入B.methodA並致電A.methodA。兩種方法共享同一個對象,當輸入A.methodA時,線程將重新輸入它已經擁有的同一個鎖。