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才能释放。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 模型分享:Indigo Furry mix(人类与野兽的混合)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

HQYJ 2024-2-21 作业

复习课上内容(已完成)结构体字节对齐,64位没做完的做完,32位重新都做一遍,课上指定2字节对齐的做一遍,自己验证(已完成)两种验证大小端对齐的代码写一遍复习指针内容(已完…

c++:蓝桥杯的基础算法2(构造,模拟)+练习巩固

目录 构造 构造的基础概念: 模拟 练习1:扫雷 练习2:灌溉 练习3:回文日期 构造 构造的基础概念: 构造算法是一种用于解决特定问题的算法设计方法。在C语言中,构造算法通常涉及到创建一个函数或类来实…

软考-中级-系统集成2023年综合知识(一)

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 软考中级专栏回顾 专栏…

adb-连接模拟器和真机操作

目录 1. 连接模拟器(夜神模拟器示例) 1.1 启动并连接模拟器 1.2 开启调试模式 2. USB连接真机调试 2.1 usb数据线连接好电脑,手机打开调试模式 2.2 输入adb devices检测手机 3. Wifi连接真机调试 3.1 USB连接手机和电脑 3.2 运行 adb…

世界顶级名校计算机专业学习使用教材汇总

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-IauYk2cGjEyljid0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

第四十一回 还道村受三卷天书 宋公明遇九天玄女-python创建临时文件和文件夹

宋江想回家请老父亲上山,晁盖说过几天带领山寨人马一起去。宋江还是坚持一个人去。 宋江到了宋家村,被两个都头和捕快们追捕,慌不择路,躲进了一所古庙。一会儿,听见有人说:小童奉娘娘法旨,请星主…

深度学习神经网络实战:多层感知机,手写数字识别

目的 利用tensorflow.js训练模型,搭建神经网络模型,完成手写数字识别 设计 简单三层神经网络 输入层 28*28个神经原,代表每一张手写数字图片的灰度隐藏层 100个神经原输出层 -10个神经原,分别代表10个数字 代码 // 导入 Ten…

基于FPGA的I2C接口控制器(包含单字节和多字节读写)

1、概括 前文对IIC的时序做了详细的讲解,还有不懂的可以获取TI的IIC数据手册查看原理。通过手册需要知道的是IIC读、写数据都是以字节为单位,每次操作后接收方都需要进行应答。主机向从机写入数据后,从机接收数据,需要把总线拉低来…

CSP-J 2023 T3 一元二次方程

文章目录 题目题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题目传送门题解思路总代码 提交结果尾声 题目 题目背景 众所周知,对一元二次方程 a x 2 b x c 0 , ( a ≠ 0 ) ax ^ 2 bx c 0, (a \neq 0) ax2bxc0,(a0),可…

收单外包机构备案2023年回顾和2024年展望

孟凡富 本文原标题为聚合支付深度复盘与展望,首发于《支付百科》公众号! 收单外包服务机构在我国支付收单市场中占据着举足轻重的地位,其规模在政策引导和市场需求驱动下不断扩大。同时,随着行业自律管理体系的持续发展和完善&a…

pycharm 远程运行报错 Failed to prepare environment

什么也没动的情况下,远程连接后运行是没问题的,突然在运行时就运行不了了,解决方案 清理缓存: 有时候 PyCharm 的内部缓存可能出现问题,可以尝试清除缓存(File > Invalidate Caches / Restart&#xff0…

通俗理解Kotlin及其30大特性

通俗理解Kotlin及其30大特性 文章目录 通俗理解Kotlin及其30大特性前言背景编译&运行字节码对比 Java VS Kotlin变量/常量类型声明变量初始化空安全特性 函数函数声明函数参数函数可变参数局部函数函数/属性/操作符的扩展函数/属性的引用操作符重载Lambda 表达式数组/List/…

css中选择器的优先级

CSS 的优先级是由选择器的特指度(Specificity)和重要性(Importance)决定的,以下是优先级规则: 特指度: ID 选择器 (#id): 每个ID选择器计为100。 类选择器 (.class)、属性选择器 ([attr]) 和伪…

一个服务器实现本机服务互联网化

欢迎来到我的博客,代码的世界里,每一行都是一个故事 一个服务器实现本机服务互联网化 前言痛点关于中微子代理实战演练搭建服务端搭建客户端服务端配置代理实现 前言 在数字世界的网络战场上,中微子代理就像是一支潜伏在黑暗中的数字特工队&…

PacketSender-用于发送/接收 TCP、UDP、SSL、HTTP 的网络实用程序

PacketSender-用于发送/接收 TCP、UDP、SSL、HTTP 的网络实用程序 PacketSender是一款开源的用于发送/接收 TCP、UDP、SSL、HTTP 的网络实用程序,作者为dannagle。 其官网地址为:https://packetsender.com/,Github源代码地址:htt…

Java 事件处理机制

一、快速入门 import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseListener; import java.awt.event.WindowListener;public class BallMove extends JFrame { //窗口MyPanel mp null…

一款高输出电流 PWM 转换器

一、产品描述 TPS543x 是一款高输出电流 PWM 转换器,集成了低电阻、高侧 N 沟道 MOSFET。具有所列的特性的基板上还包括高性能电压误差放大器(可在瞬态条件下提供高稳压精度)、欠压锁定电路(用于防止在输入电压达到 5.5V 前启动&…

Py之ydata-profilin:ydata-profiling的简介、安装、使用方法之详细攻略

Py之ydata-profilin:ydata-profiling的简介、安装、使用方法之详细攻略 目录 ydata-profiling的简介 1、主要特点 2、案例应用 (1)、比较数据集、对时序数据集进行分析、对大型数据集进行分析、处理敏感数据、数据集元数据和数据字典、自定义报告的外观、不同类型…

【MATLAB源码-第144期】基于matlab的蝴蝶优化算法(BOA)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 ​蝴蝶优化算法(Butterfly Optimization Algorithm, BOA)是基于蝴蝶觅食行为的一种新颖的群体智能算法。它通过模拟蝴蝶个体在寻找食物过程中的嗅觉导向行为以及随机飞行行为,来探索解空间…