首先要理解什么是可重入?所谓可重入,就是同一个线程可以获取同一把锁多次在public class Son extends Father{
public synchronizd void doSomething () {
super.doSomething();
}
}
中,super.doSomething();方法要获取锁,进入本类的doSomething 也要获取锁。每个对象都关联了一把锁,非static方法的synchronizd获取的就是这个与对象关联的锁,也就是说进入本类的doSomething要获取对象锁,进入 super.doSomething();还要获取这把锁,如果内置锁是不可重入的,永远也进入不了super.doSomething();
public synchronizd void doSomething () {
super.doSomething();
}
}
中,super.doSomething();方法要获取锁,进入本类的doSomething 也要获取锁。每个对象都关联了一把锁,非static方法的synchronizd获取的就是这个与对象关联的锁,也就是说进入本类的doSomething要获取对象锁,进入 super.doSomething();还要获取这把锁,如果内置锁是不可重入的,永远也进入不了super.doSomething();
每个类都有一个唯一的锁。 当一个进程获取了锁之后,其他进程就只能等待前一个进程释放锁,才能执行加锁的代码。
内部锁,就是当同一个进程调用同一个类的锁的时候,如果没有内部锁重入,它就获取不到锁。
有了内部锁重入机制,当线程试图获得它自己占有的锁时,请求会成功。详情见:
http://blog.csdn.net/haydenwang8287/article/details/5837734
在这里蒙了是因为不知道super.doSomething() 也是子类的一个方法,算起来是两个方法。之前以为super.doSomething()的锁是父类的,怎么变成同一把锁了? 这算继承过来了吧?