我们经常用的synchronized是可重入锁,你们经常用的,我不会用的ReentrantLock也是可重入锁。那么可重入锁究竟是什么呢?
可重入,同一个线程就是可以重复获取相同的锁。我们来看看这段代码吧
public class Person {
public synchronized void fly(int i){
if(i==0)return;
System.out.println(Thread.currentThread().getName()+"这个人还能飞"+i+"次");
fly(i-1);
}
}
public class Main {
public static void main(String[] args) {
final Person person=new Person();
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
person.fly(10);
}
});
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
person.fly(10);
}
});
t1.start();
t2.start();
}
}
执行结果
很容易看出来,当线程0抢到锁后,他仍然能继续调用有synchronized锁的方法,所以证明了synchronized是可重入锁,也了解了可重入锁是什么。