1.可重入锁(也叫做递归锁)

指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。

也即是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。

ReentrantLock/synchronized就是一个典型的可重入锁。

可重入锁最大的作用是避免死锁。

2.代码

复制代码
package com.mydemo;

public class SynchronizedReentrantLockDemo {//java锁之可重入锁和递归锁代码验证 Synchronized可入锁演示程序

    public static void main(String[] args) {
        Phone phone = new Phone();
        new Thread(()->{
            phone.sendSMS();

        },"t1").start();
        new Thread(()->{
            phone.sendSMS();

        },"t2").start();
    }
}
class Phone{
    public synchronized void sendSMS(){
        System.out.println(Thread.currentThread().getName()+"\t invoke sendSMS()");
        sendEmail();
    }

    public synchronized void sendEmail(){
        System.out.println(Thread.currentThread().getName()+"\t invoke sendEmail()");

    }
}
复制代码

3.执行结果

t1     invoke sendSMS()
t1     invoke sendEmail()
t2     invoke sendSMS()
t2     invoke sendEmail()

 4.ReentrantLock可重入锁演示程序

复制代码
package com.mydemo;

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

public class ReentrantLockDemo {
    public static void main(String[] args) {
        Phone2 phone2 = new Phone2();
        new Thread(phone2,"t1").start();
        new Thread(phone2,"t2").start();

    }
}
class Phone2 implements Runnable{
    Lock lock=new ReentrantLock();
    public void getLock() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "\t get Lock");
            setLock();
        } finally {
            lock.unlock();
        }
    }
    public void setLock() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "\t set Lock");
        } finally {
            lock.unlock();
        }
    }





    @Override
    public void run() {
        getLock();

    }
}
复制代码

5.执行结果

t1     get Lock
t1     set Lock
t2     get Lock
t2     set Lock

 6.ReentrantLockDemo 

 

复制代码
package com.mydemo;

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

public class ReentrantLockDemo {
    public static void main(String[] args) {
        Phone2 phone2 = new Phone2();
        new Thread(phone2,"t1").start();
        new Thread(phone2,"t2").start();

    }
}
class Phone2 implements Runnable{
    Lock lock=new ReentrantLock();
    public void getLock() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "\t get Lock");
            setLock();
        } finally {
            lock.unlock();
        }
    }
    public void setLock() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "\t set Lock");
        } finally {
            lock.unlock();
        }
    }





    @Override
    public void run() {
        getLock();

    }
}
复制代码

7.执行结果

t1     getLock
t1     setLock
t2     getLock
t2     setLock

 

posted on   upupup-999  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~



点击右上角即可分享
微信分享提示