温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-09-23 09:08:35 来源:亿速云 阅读:121 作者:柒染 栏目:编程语言

今天就跟大家聊聊有关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可重入锁验证的操作方法有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI