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可重入锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring mvc Controller和RestFul原理解析
这篇文章主要介绍了Spring mvc Controller和RestFul原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-03-03关于Java单个TCP(Socket)连接发送多个文件的问题
这篇文章主要介绍了关于Java单个TCP(Socket)连接发送多个文件的问题,每次我只能使用一个 Socket 发送一个文件,没有办法做到连续发送文件,本文来解决这个问题,需要的朋友可以参考下2023-04-04SpringBoot解决BigDecimal传到前端后精度丢失问题
这篇文章将通过示例详细为大家介绍SpringBoot如何解决BigDecimal传到前端后精度丢失问题,文中的示例代码讲解详细,感兴趣的可以了解一下2022-06-06
最新评论