Java入门-可重入锁

可重入锁

什么是可重入锁?

当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁;

image-20230728110933738

可重入锁案例

程序可重入加锁 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才能释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484677.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泽攸科普——扫描电子显微镜(SEM)像衬度形成原理

扫描电镜通过电子束在样品表面进行周而复始的扫描运动,同时实时监测各种信号图像的产生,然后根据产生的信号多少来调制图像。 引起各种信号产生的扫描电镜图像衬度的来源有三个方面: 1. 试样本身性质:包括表面的凹凸不平、成分的…

哪些软件可以把试卷照片转换成电子版?试试这些软件

哪些软件可以把试卷照片转换成电子版?在数字化时代,纸质试卷的保存和传输都显得不太方便。为了解决这个问题,我们可以将试卷照片转换成电子版。下面,我将为大家介绍5款可以轻松实现这一功能的软件,让你轻松应对各种试卷…

代码随想录算法训练营第58天 | 392.判断子序列 115.不同的子序列

判断子序列 这道题可以双指针方法解决。 class Solution { public:bool isSubsequence(string s, string t) {int s_index 0;for(int t_index 0; t_index < t.size(); t_index) {if(s[s_index] t[t_index]) {s_index;}}return s_index s.size();} };用动态规划也是可解…

对象池模式-Object Pool Pattern

原文地址:https://jaune162.blog/design-pattern/object-pool-pattern/ 原文中可下载高清SVG矢量类图 引言 对象池模式(Object Pool Pattern)是一种创建一组可重用对象的设计模式。它通过维护一个预分配的对象集合,避免了频繁地创建和销毁对象所带来的性能开销。在需要使用…

MasterAlign背光贴合视觉应用软件说明书

今天为大家介绍下MasterAlign视觉软件在背光贴合行业中该如何使用

HTML好玩代码合集(2)

这一期HTML好玩代码合集是动态烟花文字,是本期里最好玩的一个HTML代码(把文字可以改成表白的),先看效果: 这个效果是动态的,那些数字都是有烟花堆积成的,代码在哪里呢? 在这里: <!DOCTYPE html> <html lang="en"> <script>var _hmt = _…

QT day3 作业2.22

思维导图&#xff1a; 作业&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到…

Code Composer Studio (CCS) - Build All

Code Composer Studio [CCS] - Build All 1. Build AllReferences 1. Build All Project -> Build All (Ctrl B) References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

保护你的Web应用——CSRF攻击与防御

在Web应用开发过程中&#xff0c;保护用户的隐私和安全至关重要。而CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09;攻击是一种常见的安全威胁&#xff0c;通过利用受信任用户的身份进行恶意操作&#xff0c;威胁到用户的账户和数据安全。本文…

七、计算机视觉-图像的ROI区域

文章目录 1、什么是ROI2、ROI如何实现的3、一个案例总结 1、什么是ROI 在计算机视觉中&#xff0c;ROI代表感兴趣区域&#xff08;Region of Interest&#xff09;&#xff0c;它是指图像或视频中被指定为需要特别关注或处理的区域。ROI可以帮助减少计算量&#xff0c;并且在处…

什么是HTTP代理,socks5代理?它们的区别是什么?

什么是HTTP代理&#xff1f; HTTP代理是一种常见的网络代理方式&#xff0c;它通过在客户端和服务器之间建立一个中间层&#xff0c;将客户端的请求转发给服务器&#xff0c;并将服务器的响应返回给客户端。HTTP代理通常用于访问受限制的网站&#xff0c;或者在网络中隐藏客户…

消息中间件之RocketMQ源码分析(十三)

Broker消息存储机制 RocketMQ首先将消息数据写入操作系统PageCache&#xff0c;然后定时将数据刷入磁盘。接下来主要分析RocketMQ是如何接收发送消息请求并将消息写入PageCache的&#xff0c;整个过程如图 Commit目录下有多个CommitLog文件&#xff0c;其实CommitLog只有一个…