synchronized和ReentrantLock可重入锁验证的操作方法

今天就跟大家聊聊有关synchronized和ReentrantLock可重入锁验证的操作方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

一个线程已经获得了一把锁,则可以再多次重复获得这把已经获取的锁而不会发生死锁(可类比生活大门锁示例)。

前言

可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。

一、synchronized可重入验证

package com.lau.javabase.lock;

/**
 * 隐式锁
 */
public class ReenterSynchronizedTest {

    public synchronized void print(){
        System.out.println("外层调用...");

        //中层调用
        print2();

        //内层调用
        print3();
    }

    public synchronized void print2(){
        System.out.println("中层调用...");
    }

    public synchronized void print3(){
        System.out.println("内层调用...");
    }

    public static void main(String[] args) {
        ReenterSynchronizedTest test = new ReenterSynchronizedTest();

//        test.print();

        test.print4();
    }

    /**
     * 同一个线程可以多次获得同一把锁
     */
    public void print4(){
        synchronized (this){
            System.out.println("外层调用呀...");
            synchronized (this){
                System.out.println("中层调用呀...");
                synchronized (this){
                    System.out.println("内层调用呀...");
                }
            }
        }
    }

}

输出:

外层调用呀...
中层调用呀...
内层调用呀...

二、ReenTrantLock可重入性验证

package com.lau.javabase.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 显示锁
 */
public class ReenterLockTest {

    public static void main(String[] args) {
        ReenterLockTest test = new ReenterLockTest();

        test.print();

        new Thread(() -> test.print2(),"t").start();
    }

    private Lock lock = new ReentrantLock();

    /**
     * 同一个线程可以多次获得同一把锁
     */
    public void print(){
        try{
            lock.lock();
            lock.lock();
            System.out.println("外层调用");

            try{
                lock.lock();
                System.out.println("中层调用");

                try{
                    lock.lock();
                    System.out.println("内层调用");
                }
                finally {
                    lock.unlock();
                }
            }
            finally {
                lock.unlock();
            }
        }
        finally {
            lock.unlock();
//            lock.unlock();
        }
    }

    public void print2(){
        try{
            lock.lock();
            System.out.println("come on!");
        }
        finally {
            lock.unlock();
        }
    }

}

输出:

外层调用
中层调用
内层调用

看完上述内容,你们对synchronized和ReentrantLock可重入锁验证的操作方法有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。