关于内置锁的可重入性

 

《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对象?)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值