首先要理解什么是可重入?所谓可重入,就是同一个线程可以获取同一把锁多次在public class Son extends Father{
 public synchronizd void doSomething () {
   super.doSomething();
 }
}
中,super.doSomething();方法要获取锁,进入本类的doSomething 也要获取锁。每个对象都关联了一把锁,非static方法的synchronizd获取的就是这个与对象关联的锁,也就是说进入本类的doSomething要获取对象锁,进入 super.doSomething();还要获取这把锁,如果内置锁是不可重入的,永远也进入不了super.doSomething();

解决方案 »

  1.   

    首先楼主要先明白锁机制,由浅入深的学习。
    每个类都有一个唯一的锁。 当一个进程获取了锁之后,其他进程就只能等待前一个进程释放锁,才能执行加锁的代码。
    内部锁,就是当同一个进程调用同一个类的锁的时候,如果没有内部锁重入,它就获取不到锁。
    有了内部锁重入机制,当线程试图获得它自己占有的锁时,请求会成功。详情见:
    http://blog.csdn.net/haydenwang8287/article/details/5837734
      

  2.   


    在这里蒙了是因为不知道super.doSomething() 也是子类的一个方法,算起来是两个方法。之前以为super.doSomething()的锁是父类的,怎么变成同一把锁了? 这算继承过来了吧?
      

  3.   

    有点不明白。。在Son类中的doSomething方法中获取到的锁是Son实例的引用,而在super.doSomething方法中获取到的是Father实例的引用??是这样吗?求解答。.