精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-11-27
《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对象?)
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-11-27
iteye最近怎么这么冷清啊?
|
|
返回顶楼 | |
发表时间:2012-11-27
My answer is YES
super.doSomething();子类会去get Widget的monitorlock,此时就会取到lock,如果monitorlock不可重入,就需要再次拿LoggingWidget的lock,but,此时LoggingWidget的lock已经被占用了,所以会发生deadlock。 支持可重入的话,只是简单的实现进入计数,每次进入+1,退出-1,如果计数器为0,则认为此时对象是没有被加锁 |
|
返回顶楼 | |
发表时间:2012-11-27
cectsky 写道 My answer is YES super.doSomething();子类会去get Widget的monitorlock,此时就会取到lock,如果monitorlock不可重入,就需要再次拿LoggingWidget的lock,but,此时LoggingWidget的lock已经被占用了,所以会发生deadlock。 支持可重入的话,只是简单的实现进入计数,每次进入+1,退出-1,如果计数器为0,则认为此时对象是没有被加锁 你的意思是 super.doSomething();子类会去get Widget的monitorlock,但是从thread dump来看没有发现lock Widget.class 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) |
|
返回顶楼 | |
发表时间:2012-11-28
shaomeng95 写道 cectsky 写道 My answer is YES
super.doSomething();子类会去get Widget的monitorlock,此时就会取到lock,如果monitorlock不可重入,就需要再次拿LoggingWidget的lock,but,此时LoggingWidget的lock已经被占用了,所以会发生deadlock。 支持可重入的话,只是简单的实现进入计数,每次进入+1,退出-1,如果计数器为0,则认为此时对象是没有被加锁 你的意思是 super.doSomething();子类会去get Widget的monitorlock,但是从thread dump来看没有发现lock Widget.class 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) 因为JVM的可重入解决了这个问题啊,所以dump里看到的是正确的流程。 |
|
返回顶楼 | |
浏览 3948 次