千家信息网

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

发表于:2024-10-21 作者:千家信息网编辑
千家信息网最后更新 2024年10月21日,今天就跟大家聊聊有关synchronized和ReentrantLock可重入锁验证的操作方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一
千家信息网最后更新 2024年10月21日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可重入锁验证的操作方法有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0