1、什么是可重入?
synchronized (locker){
synchronized (locker){
//代码
}//括号1
//代码
}//括号2
针对同一个线程,一个对象,连续加锁两次时,由于第一次加锁释放后,才能进行第二次加锁。
这里我们第一次加锁后,要到括号2的位置才进行释放;而不执行第二次加锁便代码便不能执行到括号2的位置。因此便产生了死锁。
为了解决这个问题,我们引入了可重入琐。
2、可重入琐
这里我们介绍一下什么是可重入琐和不可重入琐
针对一个线程,一把锁,对同一个对象连续加锁两次:
如果是可重入琐,则不会出现死锁
如果是不可重入琐,则会出现死锁
可重入琐,在同一个线程中,只要是针对同一个锁对象,那么我们无论嵌套加锁多少次,都可以顺利进入。也就是说在上述代码中,第一次加锁并没有释放,但我们仍然能够进行第二次加锁。
常见的可重入琐有:synchronized,ReentrantLock
3、synchronized
这里我们重点讲synchronized
用法代码如下
public class demo1 {
public static void main(String[] args) {
Object locker = new Object();
Thread thread = new Thread(()->{
synchronized (locker){
System.out.println("加上了第一把锁");
synchronized (locker){
System.out.println("加上了第二把锁");
}
System.out.println("释放了第二把锁");
}
System.out.println("释放了第一把锁");
});
thread.start();
}
}
执行成功
要注意的是,在最外层括号执行结束后,琐才被释放