public synchronized void methodA(int a, int b);
public synchronized void methodB(int a){
methodA(a, 0);
}
B方法可以執行吧……就是說B方法獲得鎖之后,調用的A方法也可以獲得該鎖?
加在非static方法上的synchronized方法是和synchronized(this)塊等價的,均為對象鎖,即對this加鎖。
獲得當前對象鎖的線程,可以繼續獲得當前對象鎖,JVM負責跟蹤對象被加鎖的次數。線程運行B方法,此時如果this鎖可以用,線程獲得該鎖,線程給對象加鎖,計數器變成1,然后B方法調用A方法,由於是對同一個對象同一個線程,線程可以繼續獲得鎖,計數器變為2,表示this被加鎖2次。A方法完畢后,線程釋放鎖,計數器變為1,此時對象鎖對其他線程依然是不可獲得的。B方法完畢后,線程繼續釋放鎖,此時計數器變為0,表示鎖被完全釋放,其他線程可以獲得對象鎖。
獲得當前對象鎖的線程,可以繼續獲得當前對象鎖,JVM負責跟蹤對象被加鎖的次數。線程運行B方法,此時如果this鎖可以用,線程獲得該鎖,線程給對象加鎖,計數器變成1,然后B方法調用A方法,由於是對同一個對象同一個線程,線程可以繼續獲得鎖,計數器變為2,表示this被加鎖2次。A方法完畢后,線程釋放鎖,計數器變為1,此時對象鎖對其他線程依然是不可獲得的。B方法完畢后,線程繼續釋放鎖,此時計數器變為0,表示鎖被完全釋放,其他線程可以獲得對象鎖。
要明白兩個問題,
1.鎖的對象是誰,2.誰持有了鎖。
假設方法A和B是在同一個類Test中的兩個方法。
Test t=new Test();
t.methodB();
假設方法A和B是在同一個類Test中的兩個方法。
Test t=new Test();
t.methodB();
可以,一個線程對
同一個對象的鎖可以反復獲取
。這種
同步鎖稱為可重入的鎖。
