【业务功能篇70】可重入锁与不可重入锁

news2025/4/6 0:55:02

介绍

本篇介绍的是可重入锁和不可重入锁。可指的是可以,不可指的是不可以。重入指的是重复进入同步作用域。这里的同步作用域可以是同步代码块,也可以是同步方法或者是lock锁同步代码,无论是进入哪一个同步作用域,都意味着同步锁被重复使用。所以重入也有重复使用同步锁的意思。锁指的是同步锁,综上锁述,可重入锁指的是可以重复使用的同步锁。不可重入锁指的是不可以重复使用的同步锁。那么哪些锁是可承认锁,哪些锁是不可承认锁呢?

 

  • 这张表列举了可重入锁与不可重入锁对象,可重复有4个,分别是synchronize,reentrantlock和reentrantreadwritelock.Readlock以及writelocke,不可重入锁没有内置对象,需要我们自己实现。本节的最后我们会去实现一个不可重入锁。下面我们分别来演示可重入锁与不可重入锁。 

可重入锁

首先演示的是可重入锁,以同步代码为例,写一个同步锁为main.class的同步代码块,在代码块中输出一句话,然后再在同步代码块中写一个同步锁为main.class的同步代码块,目的是测试同步锁是否能重复使用。 

接着在第二个同步代码块中也输出一句话,观察执行结果。

 从执行结果来看,程序顺利执行,说明同步代码块上的同步锁可重复使用。

再来看看同步方法的实例,我们知道同步方法分为静态与非静态,这里我们就以静态同步方法为例,定义一个静态同步方法Printa,他的同步锁为类名点class,也就是main.class,然后在Printa方法中说出一句话,接着再定义一个静态同步方法printb,同步锁也为main.class,在printb方法中也说出一句话,然后在printerA A方法中调用printb,目的是测试同步锁是否可重复使用,最后在main方法中调用printa观察执行结果。  

 

 从执行结果来看,程序顺利执行,说明同步方法上的同步锁可重复使用。

  • 再来看看可重组锁的最后一个例子,创建一个lock锁,new一个reentrantlock对象,调用它的lock方法获取锁,写上try finally代码块,在finally代码块中调用unlook方法释放锁。在try代码块中说出一句话,接着再次调用lock方法获取锁,目的是测试lock锁是否可重复使用。同样的写上try---finally代码块,在finally代码块中调用unlock方法释放锁,最后在try代码块中输出一句话,观察执行结果。  

 

从执行结果来看,程序顺利执行

说明reentrantlock锁可重复使用,可重入锁演示完毕 


不可重入锁

接下来来看看不可重入锁,因为不可重锁没有内置对象,所以需要我们自己去实现一个不可重入锁。这里我们先理清一下实践的思路,既然是锁,锁以我们首先要实现的是lock接口,这个毋庸置疑,因为lock接口里面,它定义了同步锁的规则,实现它里面的规则,就算是自定义好了一把锁,然后我们需要绑定已经获取到锁的线程,这一步必不可少。哪一个线程获取到了锁,需要记录下来,保证同一时刻只有一个线程拿到锁。 

  • 接着我们要去实现获取锁的方法,也就是实现lock接口中的lock方法。最后我们还需要实现释放锁的方法,也就是实现lock接口中的 unlock方法。

  • 下面我们就按照这个思路,开始自定义一个不可重入锁,定义一个类。unreentrantlock。实现locker接口。重写lock接口中的方法,它里面一共有6个方法,我们不需要全部都实现,着重实现lock和unlock方法就可以了。定义一个thread类型的属性,用于记录已获取锁的线程。 

 

  • 接下来我们先来实现lock方法,写一个同步锁为this的同步代码块,目的是同一时刻最多只有一个线程执行绑定操作,使用while循环,判断当前是否已经绑定过线程,当已经绑定过线程时,使当前线程等待等待下一次绑定。 


如果当前没有绑定任何线程,则绑定当前线程。

 

  •  至此lock方法编写完毕,再来编写unlock方法。同样的写上同步锁为this的同步代码块,目的是同一时刻最多只有一个线程执行解绑操作,判断当前线程是否为绑定线程。如果不是直接return,如果是则解绑线程,将thread置为null,并唤醒所有等待的线程,这些被唤醒的线程他们可以继续绑定。

  • 至此unlook方法编写完毕,整个已经全部编写完毕。下面来使用该锁,还是之前的例子,将可重入锁reentrantlock改为unreentrantlock 

 

运行程序观察执行结果。 

从执行结果来看,程序只打印了第一次获取锁,然后就进入了等待,说明不可重入锁发挥的作用,至此不可重入锁演示完毕。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解锁数据潜力:信息抽取、数据增强与UIE的完美融合

解锁数据潜力:信息抽取、数据增强与UIE的完美融合 1.信息抽取(Information Extraction) 1.1 IE简介 信息抽取是 NLP 任务中非常常见的一种任务,其目的在于从一段自然文本中提取出我们想要的关键信息结构。 举例来讲&#xff0…

大数据及软件教学与实验专业实训室建设方案

一 、系统概述 大数据及软件教学与实验大数据及软件教学与实验在现代教育中扮演重要角色,这方面的教学内容涵盖了大数据处理、数据分析、数据可视化和大数据应用等多个方面。以下是大数据及软件教学与实验的一般内容:1. 数据基础知识:教授学生…

5、flink任务中可以使用哪些转换算子(Transformation)

1、什么是Flink中的转换算子 在使用 Flink DataStream API 开发流式计算任务时,可以将一个或多个 DataStream 转换成新的 DataStream,在应用程序中可以将多个数据转换算子合并成一个复杂的数据流拓扑图。 2、常用的转换算子 Flink提供了功能各异的转换算…

尚硅谷大数据项目《在线教育之离线数仓》笔记002

视频地址:尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 P025 P026 P027 P028 P029 P030 P031 P032 P033 P034 P035 P036 P037 P038 P025 在Hive所在节点部署Spark P026 3)Hive on Spark测试 (1)…

kali linux查看局域网下所有IP,并对指定IP攻击

kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击 首先我们打开我们熟悉的kali linux操作系统,利用指令: ifconfig来确认本机的ip地址 确认了本机的ip地址之后,利用一下的指令查看局域网下所有ip: fping -g 本机IP地址…

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀

今日目标 能够编写SpringMVC入门案例 了解SpringMVC原理 1. SpringMVC介绍 1.1 SpringMVC概述 思考:SpringMVC框架有什么优点? SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 天…

Java进阶篇--迭代器模式

目录 同步迭代器(Synchronous Iterator): Iterator 接口 常用方法: 注意: 扩展小知识: 异步迭代器(Asynchronous Iterator): 常用的方法 注意: 总结&#xff1a…

【S32K 进阶之旅】S32K 芯片的解锁

在使用 S32K1xx MCU 的过程中,因为某些不当操作导致芯片被锁、加密的情况偶有发生,在此总结一篇如何解锁芯片的文档,希望能够帮到有需要的人。 1. S32K 芯片被锁的现象及原因分析1)在S32K 系列 MCU 开发和生产过程中&#xff…

【Unity细节】Unity中的层级LayerMask

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

元宇宙是什么?有哪些应用方向?一文了解元宇宙虚拟展厅

引言: 在当今数字科技飞速发展的时代,元宇宙作为一个令人向往的概念正逐渐进入大众的视野。那么,什么是元宇宙?元宇宙又有哪些应用方向呢?元宇宙虚拟展厅又有哪些优势呢? 一.元宇宙是什么 元宇…

eNSP 打开警告:请将eNSP相关应用程序添加到windows firewall的允许程序列表,并允许其在公用网络上运行!

文章目录 1 警告截图2 解决办法 1 警告截图 2 解决办法 思路:按照警告的提示信息,将 eNSP 相关应用添加到 windows firewall(防火墙)的允许程序列表,并允许其在公用网络上运行!此处以 Win 10 为例

怎么把人物抠到一个视频里?这个视频抠像方法一看就会

在视频中,人物抠像可以用于创建有趣的视觉效果,例如将人物放置在不同的场景中,或者创建动画效果。此外,它还可以用于制作特效,例如将人物的外观更改为其他形象,或者在人物移动时添加轨迹效果。那么怎么把人…

Eclipse常见的使用技巧(快捷键)大全

常用设置,非常建议 1.代码提示设置 2.快捷键设置 代码编写技巧 注意: 如果你设置了代码提示,那么下面操作快捷方式回车即可生成,不必alt/ 换行 ShiftEnter回车,不管光标在哪里都会换行!非常好用&…

向日葵如何截图

场景 向日葵远程时,有时需要截图,但是客户电脑上没有qq、微信等软件提供快捷截图。 怎么办呢? 解决方案 其实向日葵肯定支持这些功能的。 设置 | 热键设置 | 勾选 远控其他设备时,可输入热键进行以下操作。 如果: altq 切换…

性能测试-并发用户数估算(超细整理)

前言 并发用户数:是指现实系统中操作业务的用户,在性能测试工具中,一般称为虚拟用户数(Virutal User)。 并发用户数和注册用户数、在线用户数的概念不同。 并发用户数一定会对服务器产生压力的; 而在线用户数只是 ”挂” 在系统…

一万字关于java数据结构堆的讲解,让你从入门到精通

目录 java类和接口总览 队列(Queue) 1. 概念 2. 队列的使用 以下是一些常用的队列操作: 1.入队操作 2.出队操作 3.判断队列是否为空 4.获取队列大小 5.其它 优先级队列(堆) 1. 优先级队列概念 Java中的PriorityQueue具有以下特点 2.常用的PriorityQue…

Doris的执行计划生成、分发与执行

目录 一、执行计划的生成 二、执行计划的分发 三、执行计划的执行 一、执行计划的生成 在Doris的FE端,与大多数数据库系统一样,要从SQL或某种http请求,生成执行计划,从SQL生成,一开始是“抽象语法树”(…

FreeRTOS 从入门到精通-任务调度

初写FreeRTOS 从入门到精通系列文章之初,笔者只是当作可以随时回顾的学习笔记来写,并没有想到这些偏技术的文章收获了意料之外的阅读量和关注。首先当然很欣喜自己的文章能够得到了读者们的认可,但同时也有种使命感,既期望启迪并与…

模型评估的常用指标

模型评估的指标 模型是在大量的数据集上训练而来的,无论一个模型是从零训练的还是基于某一个模型,通过微调方法得到的,靠人工评价模型的效果都是异常困难的。那么要想客观的、自动化的评价一个LLM模型,就需要能够选择正确评估模型效果的指标或者基准测试,来客观和自动化的…

C语言刷题指南(二)

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…