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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~