package thead.safe.safe6;

/**
 * sychronized 锁重入指的是一个线程在获得一个锁之后，可以再次进入该锁（即再次获取锁）而不会发生死锁。
 * 这是因为 sychronized 锁是可重入的（reentrant）。
 * 当一个线程获取锁并进入一个同步方法时，它的锁计数会增加。
 * 该线程在执行另一个同步方法时，锁计数继续增加，表示它可以再次进入同步方法。
 * 只有当线程释放锁时，锁计数才会递减，最终锁计数为 0 时，锁才会被释放。
 */
public class SynchronizedReentrantExample {

    public static void main(String[] args) {
        SynchronizedReentrantExample example = new SynchronizedReentrantExample();

        // 创建一个线程来调用 method1
        Thread thread = new Thread(example::method1);
        thread.start();
    }

    // 这个方法是同步的，任何线程都只能一个接着一个访问它
    public synchronized void method1() {
        System.out.println("In method1.");

        // 在 method1 中调用 method2，这是对同一个锁的重入
        method2();
    }

    // 这个方法也是同步的，线程会在这里等待直到获得锁
    public synchronized void method2() {
        System.out.println("In method2.");

        // 在 method2 中调用 method3，这是对同一个锁的重入
        method3();
    }

    // 这个方法也是同步的，继续重入锁
    public synchronized void method3() {
        System.out.println("In method3.");
    }
}
