Java可重入锁的实现示例
什么是可重入锁?
当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁;

可重入锁案例
程序可重入加锁 A.class,没有发生死锁。
sychronized锁
package com.wnhz.lock.reentrant;
public class SychronizedDemo {
class A {
void a() {
}
}
class B {
void b() {
}
}
public static void main(String[] args) {
System.out.println("准备锁住class A >>>>");
synchronized (A.class) {
System.out.println("锁住class A--> 成功");
System.out.println("准备再次锁住class A >>>>");
synchronized (A.class) {
System.out.println("锁住class A--> 成功");
}
System.out.println("释放class A");
}
}
}
运行结果
准备锁住class A >>>>
锁住class A--> 成功
准备再次锁住class A >>>>
锁住class A--> 成功
释放class A
ReentrantLock
package com.wnhz.lock.reentrant;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockDemo {
private static final Lock lock = new ReentrantLock();
class A {
void a() {
}
}
class B {
void b() {
}
}
public static void main(String[] args) {
System.out.println("准备锁住class A >>>>");
lock.lock();
try {
System.out.println("锁住class A--> 成功");
System.out.println("准备再次锁住class A >>>>");
lock.lock();
try {
System.out.println("锁住class A--> 成功");
} finally {
System.out.println("释放第二次锁住的class A");
}
} finally {
lock.unlock();
System.out.println("释放第一次锁住的Class A对象");
}
}
}
运行结果
准备锁住class A >>>>
锁住class A--> 成功
准备再次锁住class A >>>>
锁住class A--> 成功
释放第二次锁住的class A
释放第一次锁住的Class A对象
如何保证可重入
当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储偏向的线程ID,以后该线程在进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需简单测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁。如果测试成功,表示线程已经获得了锁。如果测试失败,则需要再测试一下Mark Word中偏向锁标志是否设置成1:没有则CAS竞争;设置了,则CAS将对象头偏向锁指向当前线程。再维护一个计数器,同个线程进入则自增1,离开再减1,直到为0才能释放。
到此这篇关于Java可重入锁的实现示例的文章就介绍到这了,更多相关Java可重入锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Springboot logback-spring.xml无法加载问题
这篇文章主要介绍了Springboot logback-spring.xml无法加载问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-05-05
关于kafka消费不到远程bootstrap-server 数据的问题
很多朋友遇到kafka消费不到远程bootstrap-server 数据的问题,怎么解决这个问题,很多朋友不知所措,下面小编给大家带来了关于kafka消费不到远程bootstrap-server 数据的问题及解决方法,感兴趣的朋友跟随小编一起看看吧2021-11-11
BufferedInputStream(缓冲输入流)详解_动力节点Java学院整理
这篇文章主要为大家详细介绍了BufferedInputStream缓冲输入流的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-05-05
spring @Scheduled注解各参数使用以及定时任务详解
文章详细介绍了Spring框架中@Scheduled注解的各个参数,包括cron表达式、时区、fixedDelay、fixedRate、initialDelay等,并提供了多个示例来说明这些参数的使用方法2024-11-11
PowerJob的WorkerHealthReporter工作流程源码解读
这篇文章主要为大家介绍了PowerJob的WorkerHealthReporter工作流程源码解读,2023-12-12
idea中springboot整合mybatis找不到mapper接口的原因分析
这篇文章主要介绍了idea中springboot整合mybatis找不到mapper接口的原因分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-01-01


最新评论