线程重入:是指线程在获得这个锁之后,再次使用这个锁就不会再被这个锁所阻塞住。

线程重入,原先我们对死锁的概念只是认为在多个线程之间;那么,如果单个线程,需要对两把锁访问,并且满足以下四个条件:互斥使用资源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();
        //但是实际上确实可以的,原因在于线程重入:线程在获得一个锁后,再次的访问这个锁时,这个锁就不会对这个线程有任何的阻挠。
        //类似于人脸时的录入
    }
}