【Java | 多线程】可重入锁的概念以及示例

news/2024/9/23 4:38:39/

什么是可重入(Reentrant Lock)?

可重入(又名递归)是一种特殊类型的,它允许同一个线程在获取后再次进入该保护的代码块或方法,而不需要重新获取

说白了,可重入的特点就是同一个线程可以多次获取同一个,而不会因为之前已经获取过而阻塞。

可重入的一个优点是可以一定程度避免死

举例可重入

在Java中,ReentrantLocksynchronized都是可重入

synchronized

java">public class ReentrantLockDemo {public synchronized void outerMethod() {System.out.println("进入外层方法");innerMethod();System.out.println("退出外层方法");}public synchronized void innerMethod() {System.out.println("进入内层方法");// Do some workSystem.out.println("退出内层方法");}public static void main(String[] args) {ReentrantLockDemo demo = new ReentrantLockDemo();demo.outerMethod();}
}

outerMethod外层方法 中获取的线程能够在 innerMethod内层方法 中重新获取同一个,而不需要阻塞。

运行结果如下:

进入外层方法
进入内层方法
退出内层方法
退出外层方法

ReentrantLock

java">import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockDemo {private ReentrantLock lock = new ReentrantLock();public void outerMethod() {lock.lock(); // 获取try {System.out.println("进入外层方法");innerMethod();System.out.println("退出外层方法");} finally {lock.unlock(); // 释放}}public void innerMethod() {lock.lock(); // 再次获取try {System.out.println("进入内层方法");// 执行一些操作System.out.println("退出内层方法");} finally {lock.unlock(); // 释放}}public static void main(String[] args) {ReentrantLockDemo demo = new ReentrantLockDemo();demo.outerMethod();}
}

Synchronized可重入的实现原理

事实上,每个对象拥有一个计数器和一个指向持有该的线程的指针。

当执行 monitorenter 指令时,如果目标对象的计数器为零,那么说明它没有被其他线程所持有,Java 虚拟机会将该对象的持有线程设置为当前线程,并且将其计数器加 1。

在目标对象的计数器不为零的情况下,如果对象的持有线程是当前线程,那么 Java 虚拟机可以将其计数器加 1,这是因为是可重入的,当前线程可以多次获取同一个。否则,如果对象的持有线程不是当前线程,那么当前线程需要等待,直至持有线程释放该

当执行 monitorexit 指令时,Java 虚拟机则需将对象的计数器减 1。如果计数器减到零,那么就被释放了。

monitorentermonitorexit 指令是 Java 字节码中的指令,它们是由 Java 编译器生成的。


http://www.ppmy.cn/news/1434714.html

相关文章

Python第五章之集合,切片,推导式,公共方法

集合 Set set 被称为集合, 是无序的, 并且集合中的元素都是唯一的 1. 集合的创建 s {"zs", "ls", "ww"} print(p) 打印的结果是不固定, 所以集合无序 结果为 : {"ww", "zs", "ls"} s {"zs", &quo…

Laravel 6 - 第十三章 请求

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

Mysql全局优化总结

Mysql全局优化总结 从上图可以看出SQL及索引的优化效果是最好的,而且成本最低,所以工作中我们要在这块花更多时间 服务端系统参数 官方文档:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_connections…

MySQL中的死锁预防和解决

MySQL中的死锁预防和解决 死锁是数据库管理系统中常见的问题,特别是在高并发的应用场景下。MySQL数据库中的死锁会导致事务处理速度减慢,甚至完全停止,因此理解并预防死锁至关重要。本文将详细介绍如何预防MySQL中的死锁,包括常用…

oracle 12c+ max_string_size参数

一个客户的数据库版本是19.3,在做数据库复制的时候,目标端报错了,查看了一下问题发现表的字段长度有不对,在12c以前我们都知道varchar的长度最大是4000,但是客户这里居然有32767: 把客户的建表语句弄出来,放到我的一个19c的测试环境进行测试: 发现报错了: 这里报错很明显了,是M…

重发布实验:

要求: 配置: 配置IP地址: Ar1: [a1]int g 0/0/0 [a1-GigabitEthernet0/0/0]ip add 100.1.1.1 24 [a1-GigabitEthernet0/0/0]int l 0 [a1-LoopBack0]ip add 192.168.0.1 32 [a1-LoopBack0]int l1 [a1-LoopBack1]ip add 192…

Java | 冒泡排序算法实现

大家可以关注一下专栏,方便大家需要的时候直接查找,专栏将持续更新~ 题目描述 编写一个Java程序,实现冒泡排序算法。程序需要能够接收一个整型数组作为输入,并输出排序后的数组。 冒泡排序是一种简单的排序算法,它…

计算机网络 TCP/IP体系 物理层

一. TCP/IP体系 物理层 1.1 物理层的基本概念 物理层作为TCP/IP网络模型的最低层,负责直接与传输介质交互,实现比特流的传输。 要完成物理层的主要任务,需要确定以下特性: 机械特性:物理层的机械特性主要涉及网络…