日期:2014-05-20  浏览次数:20619 次

Java 内部锁重入问题
最近在学习线程,看到书上对内部锁的重入的讲解实在百思不得其解,希望大家帮忙,3Q了。

public class Father {
  public synchronizd void doSomething() {.....}
}



public class Son extends Father{
 public synchronizd void doSomething () {
   super.doSomething();
 }
}


书上说,如果没有内部锁的重入,上面的代码就会死锁。
因为父类&子类中的方法都是synchronizd 的,都会在视图处理之前获得 父类 的锁,如果内部锁
不能重入,super.doSomething() 就永远无法得到Father的锁,因为锁已经被占用。导致等待一个永远无法获得的锁。 为什么这么说呢?
------最佳解决方案--------------------
首先楼主要先明白锁机制,由浅入深的学习。
每个类都有一个唯一的锁。 当一个进程获取了锁之后,其他进程就只能等待前一个进程释放锁,才能执行加锁的代码。
内部锁,就是当同一个进程调用同一个类的锁的时候,如果没有内部锁重入,它就获取不到锁。
有了内部锁重入机制,当线程试图获得它自己占有的锁时,请求会成功。

详情见:
http://blog.csdn.net/haydenwang8287/article/details/5837734
------其他解决方案--------------------
首先要理解什么是可重入?所谓可重入,就是同一个线程可以获取同一把锁多次



public class Son extends Father{
 public synchronizd void doSomething () {
   super.doSomething();
 }
}

中,super.doSomething();方法要获取锁,进入本类的doSomething 也要获取锁。每个对象都关联了一把锁,非static方法的synchronizd获取的就是这个与对象关联的锁,也就是说进入本类的doSomething要获取对象锁,进入 super.doSomething();还要获取这把锁,如果内置锁是不可重入的,永远也进入不了super.doSomething();
------其他解决方案--------------------
不要光看书上说的
自己动手做几个例子测试下,这样收获的效果绝对比单纯的看书要多很多的。