1. 程式人生 > >java synchronized內建鎖的可重入性

java synchronized內建鎖的可重入性

《java併發程式設計實踐》一書中,關於synchronized內建鎖的可重入的例子如下:

------------------------------------------------------------------------------------------------------

public class Widget {

    public synchronized void doSomething() {

        ...

    }

}

public class LoggingWidget extends Widget {

    public synchronized void doSomething() {

        System.out.println(toString() + ": calling doSomething");

        super.doSomething();//若內建鎖是不可重入的,則發生死鎖

    }

}

-------------------------------------------------------------------------------------------------------

小弟在此次有兩點疑惑:

1、LoggingWidget 的物件呼叫doSomething方法時,鎖物件為LoggingWidget物件

     super.doSomething()呼叫是鎖物件是誰?LoggingWidget物件 還是 Widget 的Class物件?

     執行程式,檢視thread dump發現:呼叫super.doSomething()時鎖物件依然是LoggingWidget物件

     "執行緒#1" prio=6 tid=0x0bd60400 nid=0x16f8 waiting on condition [0x0bf8f000..0x0bf8fd68]

   java.lang.Thread.State: TIMED_WAITING (sleeping)

at java.lang.Thread.sleep(Native Method)

at Widget.doSomething(Widget.java:4)

- locked <0x03fbc150> (a LoggingWidget)

at LoggingWidget.doSomething(LoggingWidget.java:5)

- locked <0x03fbc150> (a LoggingWidget)

at LoggingWidget$1.run(LoggingWidget.java:15)

   Locked ownable synchronizers:

- None

2、在網上搜索發現,大夥都如是說:

請大家討論一下,在子類呼叫父類方法時,是否同時獲取父類的鎖(父類的class物件?)