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

news/2024/6/29 12:16:13 标签: java, 开发语言,

介绍

本篇介绍的是可重入和不可重入。可指的是可以,不可指的是不可以。重入指的是重复进入同步作用域。这里的同步作用域可以是同步代码块,也可以是同步方法或者是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.niftyadmin.cn/n/4949328.html

相关文章

教育行业选择CRM的四大要求

随着互联网教育的发展和变迁,越来越多的教育机构开始意识到管理客户关系的重要性。然而,对于教育行业来说,选择一款适合自己的CRM系统也不轻松。下面就来说说,教育行业crm要如何来选择? 一、明确使用需求 在进行CRM选…

SpringBoot复习:(52)不再需要使用@EnableTransactionManagement的原因

在Spring项目中,要用事务,需要EnableTransactionManagement注解加Transactional注解。而在SpringBoot项目,有事务的自动配置类TransactionAutoConfiguration,代码如下: 可以在其内部类EnableTransactionManagementConfiguratio…

项目管理敏捷管理流程,高效敏捷项目管理解决方案

Leangoo领歌是一款永久免费的专业敏捷研发管理工具,提供敏捷研发解决方案,解决研发痛点,打造成功产品。帮助团队实现需求、迭代、缺陷、任务、测试、发布等全方位研发管理。 敏捷产品路线图管理: 产品路线图是一个高层次的战略计…

星火大模型 VS FuncGPT(慧函数), 谁更胜一筹?

哈喽,本文即通过相近的试题,看下最近爆火的科大讯飞星火大模型和 FuncGPT(慧函数)的编码能力有何区别,给大家直观地对比。 开发过程中经常会遇到读取文件内容的情况,需要【判断文件路径是目录还是文件】&am…

关于API数据接口获取商品的数据的说明

获取商品数据已经成为许多应用程序的重要组成部分。为了实现这一目标,许多公司和技术开发者使用API数据接口来获取相关数据。本文将详细介绍如何使用API数据接口获取商品数据,并使用Python作为编程语言示例来展示相关代码。 API数据接口是一种通信协议&…

matlab中exp和expm的区别

exp()为数组 X 中的每个元素返回指数 e x e^{x} ex expm()计算 X 的矩阵指数。 两个函数传入矩阵后计算的结果是不同的,千万不能混淆。之前曾经想当然得把exp里传入矩阵当矩阵指数使用,也未验证正确性,实不应该。

“深入探究JVM内部机制:如何实现Java程序的运行环境?“

标题:深入探究JVM内部机制:如何实现Java程序的运行环境? 摘要:本文将深入探究Java虚拟机(JVM)的内部机制,重点讨论JVM如何实现Java程序的运行环境。我们将从JVM的结构、类加载、内存管理、垃圾…

数据结构笔记--哈希表的相关应用(RandomPool结构,布隆过滤器和一致性哈希算法)

目录 1--RandomPool结构 2--布隆过滤器 3--一致性哈希 1--RandomPool结构 设计一种 RandomPool 结构,要求具有以下三种功能: ① insert(key):将某个 key 加入到结构中,并做到不重复加入; ② delete(key)&#xff1a…