线程重入:是指线程在获得这个锁之后,再次使用这个锁就不会再被这个锁所阻塞住。
线程重入,原先我们对死锁的概念只是认为在多个线程之间;那么,如果单个线程,需要对两把锁访问,并且满足以下四个条件:互斥使用资源1、资源二;不可抢占资源1,资源二;请求与保持:即请求锁2时依旧保持锁1的占用;锁之间构成一个闭环;这种情况下会产生死锁吗?
package com.ydlclass.lock;
public class RejoinLock {
//线程重入,原先我们对死锁的概念只是认为在多个线程之间;那么,如果单个线程,需要对两把锁访问,并且满足以下四个条件:互斥使用资源1、资源二;不可抢占资源1,资源二;请求
//与保持:即请求锁2时依旧保持锁1的占用;锁之间构成一个闭环;这种情况下会产生死锁吗?
public static final Object M1 = new Object();
public static final Object M2 = new Object();
public static void main(String[] args) {
new Thread(()->{
synchronized (M1){
synchronized (M2){
synchronized (M1){
System.out.println("hello");//如果在锁2内请求锁1 不成功,即发生了死锁,那么就不会打印这句话的;
}
}
}
}).start();
//但是实际上确实可以的,原因在于线程重入:线程在获得一个锁后,再次的访问这个锁时,这个锁就不会对这个线程有任何的阻挠。
//类似于人脸时的录入
}
}