重入:
当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然后,由于内置锁是可重入的,因此如果某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。 “重入” 获取锁的粒度是线程而不是调用。
如果内置锁(synchronized)不可重入:
举例:
class ParentLock {
public synchronized void doSomething(){
// do
}
}
class Lock extends ParentLock{
public synchronized void doSomething(){
System.out.println("do something");
// do
super.doSomething();
}
}
此处声明了ParentLock 和 Lock 两个类
Lock继承ParentLock并重写了doSomething方法然后去调用父类的doSomething方法,
由于ParentLock和Lock类中的doSomething都是synchronized方法,因此每个doSomething方法都会获取ParentLock上的锁,
如果内置锁不是可重入的,呢么调用super.doSomething()将永远无法获得锁,从而引发死锁。