第2章 线程安全与共享资源竞争

news2025/7/8 19:37:54

第2章 线程安全与共享资源竞争

2.1 synchronized同步介绍

synchronized要解决的是共享资源冲突的问题。当共享资源被任务使用时,要对资源提前加锁。所有任务都采用抢占模式,即某个任务会抢先对共享资源加上第一把锁。如果这是一个排他锁,其他任务在资源被解锁前就无法访问了。如果是共享锁,当浏览某些数据时,其他任务也可以同时浏览,但是不允许修改

Java提供了资源同步的关键字synchronized,它的作用是获取指定对象的监视器锁每个Object对象都内置了一个监视器锁,当某个线程获得了这个监视器锁后,其他线程再想获得这个对象的监视器锁,就必须要排队等待。也就是说:synchronized关键字的底层,相当于一个排他锁

2.2.1 类锁与对象锁

synchronized同步成员方法,本质使用的是当前对象的监视器锁。而synchronized同步静态方法,则使用的是当前Class的监视器锁。

java.lang.Object是所有对象的根,在Object的每个实例中都内置了对象监视器锁。

java.lang.Class的父类也是Object,在每个类型中也内置了一把锁,这与对象无关。

2.2.2 静态同步方法之间互斥

静态同步方法之间是互斥的。

2.2.3 静态同步方法与静态非同步方法

同一个类的静态同步方法与静态非同步方法之间没有干扰。

2.3 synchronized同步代码块

synchronized同步方法,就是线程在调用方法前获取对象监视器锁,方法执行完毕后就释放对象锁。

方法同步的关键是为了保护共享资源,如果synchronized方法中没有使用共享资源,就无须使用synchronized同步这个方法。

在同步方法中,使用共享资源的只是部分代码。为了提高并发性能,一般没必要在整个方法的运行期都持有监视器锁。

使用同步代码块模式,可以在方法中真正需要使用共享资源时再获取监视器锁,共享资源访问结束马上释放锁,这样就节省了对象监视器锁的占用时间,可以有效提高并发性

2.3.1 锁当前对象

synchronized (this) {}就是获取当前对象的监视器锁。synchronized同步方法,本质就是隐式使用了synchronized (this)。

2.3.2 锁其他对象

监视器锁内置于Object对象底层,所有对象的根都源于Object,因此所有对象都有监视器锁。

使用其他Object对象的监视器锁,比使用自身对象的锁代码更加灵活。

修改Clock类,使用Object对象的监视器锁,同步效果相同。代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DeJ4YqnL-1678263842735)(null)]

2.3.3 锁Class

不仅每个对象内置了监视器锁,每个数据类型Class也内置了监视器锁。因此Clock类使用内置于Class中的锁,也可以很好地实现同步效果。

修改Clock类,使用类监视器锁,同步效果相同。代码如下:

image-20230308160035040

注意,synchronized (Object.class)使用的是类锁,不是对象锁。但是轻易不要使用Object.class的类锁,因为在整个项目中,如果其他业务模块也使用Object.class的类锁,这样就会产生并发冲突。合理使用类锁的基本原则:尽量使用当前类的监视器锁,如Clock类的同步模式可以进一步优化如下:

会产生并发冲突。合理使用类锁的基本原则:尽量使用当前类的监视器锁,如Clock类的同步模式可以进一步优化如下:

image-20230308160159186

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

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

相关文章

汇编指令学习(LOOP)

一、xor异或操作,相同为0,不同为1xor eax,eaxeax异或eax,相同为0,并把结果存放到eax,简单说该语句就是想eax寄存器清零。二、ECX,计数器mov ecx,0x3将ecx寄存器设置为3三、DEC减一操作dec ecxecx寄存器的值…

扬帆优配|昔日白马股濒临退市,却6天5涨停!ST股突然集体爆发

尽管再度重申“公司股票将被停止上市”,但3月8日早间,*ST辅仁股价仍是在开盘后快速封住涨停板。这已是该公司近6个买卖日来,第5次呈现涨停。 无独有偶,8日早间ST东瀛也在此前多次涨停后,再度呈现近4%的涨幅。而就在7日…

图像的读取与保存

图像是由一个个像素点组成,像素点就是颜色点,而颜色最简单的方式就是用RGB或RGBA表示图像保存图像将像素信息按照 一定格式,一定顺序(即编码) 存在硬盘上的 二进制文件 中保存图像需要以下必要信息:1. 文件…

ChatGPT的N种用法(持续更新中。。。)

目录前言一、语法更正二、文本翻译三、语言转换3-1、Python-->JAVA四、代码解释-1五、代码解释-2六、修复代码错误六、作为百科全书七、信息提取七、好友聊天八、创意生成器8-1、VR和密室结合8-2、再结合AR九、采访问题9-1、采访问题清单9-2、采访问题清单并给出相应答案十、…

优思学院|六西格玛管理的核心理念是什么?

六西格玛管理是一种基于数据分析的质量管理方法,旨在通过降低过程的变异性来达到质量稳定和优化的目的。该方法以希腊字母“σ”为名,代表标准差,是衡量过程变异性的重要指标。 六西格玛管理的核心理念是“以客户为中心、以数据为基础、追求…

【JAVA程序设计】【C00114】基于SSM+微信小程序的食堂订餐点餐管理系统——有文档

基于微信小程序的食堂订餐点餐管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架管理前端使用vue,用户使用微信小程序的食堂订餐点餐小程序共分为三个角色:系统管理员、商家、用户 管理员角色包含以下功能: 首页展示、…

提升数字品牌的5个技巧

“品牌”或“品牌推广”的概念通常用于营销。因为建立您的企业品牌对于产品来说极其重要,品牌代表了您与客户互动的身份和声音。今天,让我们来看看在数字领域提升品牌的一些有用的技巧。如何在数字领域提升您的品牌?在了解这些技巧之前&#…

Android特别的数据结构(二)ArrayMap源码解析

1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成&#xff0c;一个int[] mHashes用来存放Key的hash值&#xff0c;一个Object[] mArrays用来连续存放成对的Key和ValuemHashes数组按非严格升序排列初始默认容量为0减容&#xff…

Hbase 映射到Hive

目录 一、环境配置修改 关闭掉hbase&#xff0c;zookeeper和hive服务 进入hive312/conf 修改hive-site.xml配置&#xff0c; 在代码最后添加配置 将hbase235的jar包全部拷贝到hive312的lib目录&#xff0c;并且所有的是否覆盖信息全部输入n&#xff0c;不覆盖 查看hive312下…

详解抓包原理以及抓包工具whistle的用法

什么是抓包? 分析网络问题业务分析分析网络信息流通量网络大数据金融风险控制探测企图入侵网络的攻击探测由内部和外部的用户滥用网络资源探测网络入侵后的影响监测链接互联网宽频流量监测网络使用流量(包括内部用户&#xff0c;外部用户和系统)监测互联网和用户电脑的安全状…

CI流水线的理解

一、概念 单元测试&#xff1a;针对软件的基本单元&#xff08;如&#xff1a;类、函数&#xff09;所做的测试。 集成测试&#xff1a;将软件代码单元集成起来后&#xff0c;以组件、模块和子系统为单位进行的测试&#xff0c;主要测试接口间的交互关系。也称组件测试&#xf…

嵌入式Linux从入门到精通之第十五节:嵌入式系统简介

嵌入式系统的层级结构如下图所示: 开发环境 这里以三星s5pv210为开发环境: 系统资源 s5pv210是三星公司推出的32位RISC微处理器,其CPU采用的是ARM Cortex-A8内核,基于ARMv7架构 丰富的片内资源,为手持设备和其它移动领域应用,提供了低价格、低功耗、高性能的微处理器解…

nodejs学习巩固笔记-nodejs基础,Node.js 高级编程(核心模块、模块加载机制)

目录Nodejs 基础大前端开发过程中的必备技能nodejs 的架构为什么是 NodejsNodejs 异步 IONodejs 事件驱动架构全局对象全局变量之 process核心模块核心模块 - path全局变量之 Buffer创建 bufferBuffer 实例方法Buffer 静态方法Buffer-split 实现核心模块之FS模块文件操作 APImd…

Chromium HTML Video 媒体播放代码梳理

经过一番探索&#xff08;参见Android 10 WebView 踩坑实录&#xff09;&#xff0c;终于搞定 Chromium WebView 的代码下载和编译问题&#xff0c;加下来就要向 H265 8K 高清播放发起冲锋。不过在打开 Chromium 源码后&#xff0c;眼前一黑。这还是熟悉的 Chromium 代码吗&…

KEIL5中头文件路劲包含问题

方式1&#xff1a;1.Keil中添加头文件相对路劲的方法在c/c配置中添加路劲&#xff0c;最终是将添加的绝对路径转化为相对路径&#xff1b;注意&#xff1a;相对路径的当前位置指.uvproj文件所在位置在C/C配置中的include paths”中添加工程所用的所有头文件的路径&#xff1b;2…

45岁VP:1000页PPT 10节实战课程,江湖再见!

与时舒卷&#xff0c;与光同尘 知识星球3年已满&#xff0c;受兄弟的盛请于是有了这2年10节课程 10节课程1000页自写的PPT20年的经验&#xff0c;N个企业不同行业的切身实际案例&#xff0c;王者课程&#xff0c;分享后江湖再见&#xff0c;华丽转身。 第1课 百万年薪CIO成长&…

线程、进程、协程的总结详细

线程、进程、协程的总结详细1 、进程1.1 进程是什么呢&#xff1f;1.2 生命周期1.3 进程同步机制1.4 进程通信机制1.4.1 管道1.4.2 消息队列1.4.3 共享内存1.4.4 信号量和PV操作1.4.5 信号1.4.6 socket1.4.7 总结 Linux 内核提供的进程通信机制2、线程2.1 线程是什么呢&#xf…

王道计算机组成原理课代表 - 考研计算机 第四章 指令系统 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 计算机组成 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “指令系统” 章节知识点总结的十分全面&#xff0c;涵括了《计算机组成原理》课程…

【GeoDjango框架解析】conda环境下安装psycopy2版本问题

GeoDjango框架解析 【GeoDjango框架解析】配置geodjango开发环境 【GeoDjango报错处理】conda环境下安装psycopy2版本问题 文章目录GeoDjango框架解析前言一、报错&#xff1a;OSError: /usr/lib/libgdal.so: undefined symbol: TIFFReadRGBATileExt, version LIBTIFF_4.0二、…

代码随想录-52-257. 二叉树的所有路径

目录前言题目1.递归和回溯2. 本题思路分析&#xff1a;3. 算法实现4. pop函数的算法复杂度5. 算法坑点前言 在本科毕设结束后&#xff0c;我开始刷卡哥的“代码随想录”&#xff0c;每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 题…