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.   

    这种情况会出现在:两个线程,一个线程先调用父类的doSomething方法,再调用子类的;另一个线程调用子类的doSomething方法,lz仔细琢磨下,看我说的这个场景有没有可能死锁呢?
      

  2.   


    谢谢老兄点拨,
    但我理解是不是反过来才会死锁?a线程调用子类的 doSomething,此时会调用到父类的方法获取父类对象的锁,此时b线程调用父类的doSomething方法也需要获取该锁,从而造成死锁。但是楼上兄弟的说法又怎么解释呢?
      

  3.   

    我之前说的不太准确,注意现在子类的do方法中是调用了父类的do方法的,假设也在父类的do方法中去new子类的对象调用子类的do方法,结合我上面的举例会死锁吗?
      

  4.   

    可以重入就不同步了 把synchronized去掉
      

  5.   

    JDK 中 sychronized 是可重入的,J2SE 并发包中的 java.util.concurrent.lock.ReentranceLock 都是可重入的。
      

  6.   

    例子就是一个synchronized 方法调用另一个synchronized 方法,因为是同一个对象,两个方法调用是同一个线程进行,再加上java的锁是可充入的,所以不会死锁。