關(guān)于重入的代碼舉例:
public class Widget{
public synchronized void doSomething(){
...
}
}
public class LoggingWidget extends Widget{
public synchronized void doSometing(){
System.out.println(toString() + ": calling doSomething");
super.doSomething();
}
}
這里如果調(diào)用了子類的doSometing方法,synchronized所使用的鎖對象一直是子類對象,super.doSomething()鎖對象也是子類對象。
為什么不是父類對象呢?我們來看下再這個例子中我們一般是怎么創(chuàng)建對象和調(diào)用方法的:
LoggingWidget lw = new LoggingWidget (); // 這里我們只創(chuàng)建了一個對象,是子類對象
lw.doSomething();
這里有幾點原則:
1掏愁、synchronized函數(shù),實際是synchronized(this)代碼塊包裹整個函數(shù)的簡寫仅孩,所用的鎖就是當(dāng)前this對象托猩,要驗證是否是同一個鎖對象,實際我們可以再父類和子類的doSomething()方法中打印出this即可辽慕。
2京腥、關(guān)于繼承和super調(diào)用,并不會創(chuàng)建一個父類對象給子類對象去引用溅蛉。
PS:靜態(tài)方法同步所用的是class鎖公浪,這又是另外一回事