线程入门3

synchronized修饰方法

synchronized可以修饰代码块(在线程入门2中有例子),也可以修饰普通方法和静态方法。

修饰普通方法

修饰普通方法简化写法:

修饰静态方法

修饰静态方法简化写法:

注意:利用synchronized上锁,锁的对象是什么不重要,重要的的是两个线程中锁的对象是否是同一个对象。

synchronized 的可重入性

所谓的可重入性,指的是,一个线程,连续对一把锁,加锁两次,或者更多次,不会出现死锁,满足这个条件就叫做“可重入性”。

例如下面代码

假设在我们第一次加锁时成功,那么locker就属于锁定状态,紧接着往下继续执行代码,又发现需要对locker进行上锁,但是刚才已经上过锁了,正常来说,对已经在一个线程中上过锁的对象,在另一个线程中又要对相同的对象进行上锁,就会发生“阻塞等待”,需要这个对象被解锁释放后才能进行上锁。

那么对于上面代码这种情况就会产生“死锁”,导致线程卡死,第二个想要加锁成功就需要第一次释放锁,需要执行到程序“1号”位置,但是想要到“1号”位置 就需要 第二次能成功加锁让程序继续往下走,由于第二次加锁处在“阻塞等待“状态,也就执不了代码,最终到不了2号位置,也就无法释放锁,因此线程就直接被卡死了。

因此在Java中synchronized被设计成”可重入锁“,就能够有效解决问题。但C++中std::mutex就是不可重入锁,就会出现死锁。

还需注意:当出现这种重复 上锁的情况时,在释放锁时,无论多少层都必须要在最外层释放锁

关于死锁

死锁的案例

1.一个线程,针对一把锁,连续加锁两次及以上,如果是不可重入锁,就会出现死锁。

2.两个线程,两把锁。此时无论是不是可重入锁都回死锁

上面这种情况就类似于生活中,家门钥匙被锁在车里了,车钥匙被锁在加里了。

3.N个线程,M把锁 (此时更容易出现死锁)

一个经典的模型就是”哲学家问题“

如图所示:

有五个哲学家,桌子上有五根筷子,哲学家只做两件事,一个是停下来思考人生什么都不做,另一个是拿起左边和右边的筷子吃面条。

哲学家什么时候吃面条,什么时候吃完停下来思考人生都是随机的,如果其中一个哲学家拿起左右两边的筷子吃面条,此时相邻的哲学家就只能等待他吃完放下筷子,就会出现阻塞等待。

本来正常运转都没什么问题,但是有一天突然出现,每个哲学家都先拿起左手边的筷子,结果发现右手边的筷子已经被拿了,此时哲学家也不会放下自己左边的筷子,只会进行等待右边何时放下筷子,这个时候没人能吃上面条,也没人能放下筷子,就导致了出现了死锁。

死锁是比较严重的bug(会导致线程卡住,也就无法在继续执行后序工作了)

死锁涉及到的四个必要条件

1.互斥使用 (锁的基本特征)当一个线程持有一把锁后,另一个线程想获得锁,就要进行阻塞等待。

2.不可抢占 (锁的基本特征)当锁已经被线程1拿到之后,线程2只能等待线程1主动释放,不嫩恶搞强行抢过来。

3.请求保持 (代码结构) 一个线程尝试获取多把锁 (先拿到锁1,尝试获取锁2,获取的时候,锁1不会释放,嵌套结构)

4.循环等待/环路等待 (代码结构)等待的依赖关系形成环了(哲学家问题)

解决死锁

解决死锁的核心就是破坏上述的必要条件,只要破坏一个,死锁就形成了,但一和二是synchronized的自带的特性,无法干预,只能从3,4入手。

对于3来说,我们可以调整代码结构,把嵌套锁的结构,改成并列结构。

对于4来说,可以约定加锁的顺序,就可以避免循环等待 (例如针对锁进行编号,加多把锁的时候,先加编号小的锁,再加编号大的锁,所有线程都要遵循这个规则)

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

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

相关文章

linux上Flexlm命令

FlexLM 是一种灵活的许可证管理系统,广泛用于各种软件产品中,如 Autodesk 的 AutoCAD 和 Autodesk 的其他产品。它允许软件开发商控制软件的使用和分发,同时提供灵活的许可证管理策略。在 Linux 系统中使用 FlexLM 通常涉及到几个关键步骤&am…

【Java学习方法】终止循环的关键字

终止循环的关键字 一、break 作用:跳出最近的循环(直接结束离break最近的那层循环) 使用场景:一般搭配if条件判断,如果满足某个条件,就结束循环,(场景:常见于暴力枚举中…

【论文精读】Reformer:高效Transformer如何突破长序列处理瓶颈?

目录 一、引言:当Transformer遇到长序列瓶颈二、核心技术解析:从暴力计算到智能优化1. 局部敏感哈希注意力(LSH Attention):用“聚类筛选”替代“全量计算”关键步骤:数学优化: 2. 可逆残差网络…

关于在Springboot中设置时间格式问题

目录 1-设置全局时间格式1.Date类型的时间2.JDK8时间3.使Date类和JDK8时间类统统格式化时间 2-关于DateTimeFormat注解 1-设置全局时间格式 1.Date类型的时间 对于老项目来说,springboot中许多类使用的是Date类型的时间,没有用到LocalDateTime等JDK8时…

面试篇:Java并发与多线程

基础概念 什么是线程?线程和进程的区别是什么? 线程 是程序执行的最小单位,它是 CPU 调度和执行的基本单元。一个进程可以包含多个线程,这些线程共享进程的资源(如内存),但每个线程有自己的栈…

【Qt/C++】QPrinter关于QInternal::Printer的解析

1. 问题分析 QInternal::Printer在Qt框架中并不是一个直接暴露给用户的API。相反,它是一个枚举值,用于标识QPaintDevice的类型。在Qt中,QPaintDevice是一个抽象类,用于任何可以进行绘制的设备,如窗口、图像、打印机等…

uniapp返回上一页接口数据更新了,页面未更新

注意:不是组件套组件可以不使用setTimeout延时 返回上一页一般会走onshow,但是接口更新了页面未更新 onShow(() > {// 切换城市后重新调用数据if (areaId.value) {const timer setTimeout(async () > {timer && clearTimeout(timer);…

MCU开发学习记录11 - ADC学习与实践(HAL库) - 单通道ADC采集、多通道ADC采集、定时器触发连续ADC采集 - STM32CubeMX

名词解释: ADC: Analog-to-Digital SAR:Successive Approximation Register 本文将介绍ADC的概念、相关函数以及STM32CubeMX生成ADC的配置函数。针对于ADC实践:单通道采集芯片内部温度传感器(ADC1_ch16)&a…

68元撬动未来:明远智睿2351开发板重塑嵌入式开发生态

在嵌入式开发领域,价格与性能的矛盾始终存在:高端开发板功能强大但成本高昂,低价产品则往往受限于性能与扩展性。明远智睿2351开发板以68元(含税)的定价打破这一僵局,通过四核1.4G处理器、全功能Linux系统与…

关于ubuntu密码正确但是无法登录的情况

参考这个文章: https://blog.csdn.net/cuichongxin/article/details/117462494 检查一下是不是用户被lock了 输入passwd -s username 如果用户是L状态,那么就是lock了。 使用 passwd -u username 解锁 关于 .bashrc 不生效 有几点: ~/.…

LeetCode-47. 全排列 II

1、题目描述: 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入:nums [1,2,3] 输出&am…

Python 设计模式:访问者模式

1. 什么是访问者模式? 访问者模式是一种行为设计模式,它允许你在不改变对象结构的前提下,定义新的操作。通过将操作封装在访问者对象中,访问者模式使得你可以在不修改元素类的情况下,向元素类添加新的功能。 访问者模…

基于stm32的智能门锁系统

标题:基于stm32的智能门锁系统 内容:1.摘要 摘要:随着科技的飞速发展,人们对家居安全的要求日益提高,智能门锁系统应运而生。本研究的目的是设计并实现一个基于STM32的智能门锁系统。采用STM32微控制器作为核心控制单元,结合指纹…

GitHub 常见高频问题与解决方案(实用手册)

目录 1.Push 提示权限错误(Permission denied) 2.push 报错:rejected non-fast-forward 3.忘记添加 .gitignore,上传了无关文件 4. 撤销最近一次 commit 5.clone 太慢或失败 6.如何切换/创建分支 7.如何合并分支 8.如何删除远程分支 9.如何 Fork + PR(Pull Reque…

【MySQL数据库入门到精通-04 DML操作】

一、DML DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。 二、添加数据 1.给指定字段添加数据 代码如下(示例): insert into 表名 (字段1,字…

2022 年 9 月青少年软编等考 C 语言六级真题解析

目录 T1. 栈的基本操作T2. stack or queue思路分析T3. 合影效果T4. 发型糟糕的一天思路分析T1. 栈的基本操作 题目链接:SOJ D1188 此题为 2022 年 6 月三级第二题仅有栈操作的版本,见 2022 年 6 月青少年软编等考 C 语言三级真题解析中的 T2。 T2. stack or queue 题目链…

美创市场竞争力突出!《2025中国数据安全市场研究报告》发布

数据要素时代,数据已成国家战略性资源,数据安全关乎国家安全!数说安全发布的《2025中国数据安全市场研究报告》(以下简称《报告》)显示,2024年数据安全市场逆势增长,市场规模首次突破百亿。《报…

VUE Element-ui Message 消息提示组件自定义封装

为了让message 信息提示的更加方便快捷,减少不同地方的调用,避免代码的重复,特意再官方message 组件的基础上二次封装,使代码更加的优雅和高效。 实现效果: 代码组件: 封装成 message.js 文件,…

高防IP能抵御哪些类型的网络攻击?

高防IP(High Defense IP)是一种专门针对网络攻击设计的防护服务,主要通过流量清洗、协议分析、行为检测等技术抵御多种网络攻击。以下是其能防御的主要攻击类型及原理: ​​一、常见防御的攻击类型​​ ​​DDoS攻击(分…

小红书文字配图平替工具

小红书的文字配图只有手机版有,想找一个电脑版的,查了一下。以下是几款类似小红书风格的花字、艺术字生成工具,适合制作吸睛的社交媒体配图,分为 手机APP 和 在线工具 两类,供你选择: 一、手机APP推荐 醒图…