多线程的锁

15.多线程编程中锁的4种状态-无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态 一:java多线程互斥,和java多线程引入偏向锁和轻量级锁的原因?--->synchronized的重量级别的锁,就是在线程运行到该代码块的时候,让程序的运行级别从用户态切换到内核态,把所有的线程挂起,让cpu通过操作系统指令,去调度多线程之间,谁执行代码块,谁进入阻塞状态。这样会频繁出现程序运行状态的切换,线程的挂起和唤醒,这样就会大量消耗资源,程序运行的效率低下。为了提高效率,jvm的... 阅读详情

简介

1、失败后进行锁膨胀:偏向锁 --> 轻量锁 --> 重量锁。

2、偏向锁:认为没有竞争,每次都是同一个线程获取的锁,所以第一次通过CAS后,把线程id放到锁对象Mark Word后,以后每次都不需要CAS操作。

3、轻量级锁:认为没有竞争,每次都是不同线程轮流获取的锁,所以利用CAS拷贝Mark Word副本对象到线程的栈中存储,以后每次通过CAS操作减少使用互斥量的开销。

自旋锁

多线程同步时,频繁挂起和恢复线程开销比较大,让线程执行一个忙循环(自旋),就是所谓的自旋锁。jdk1.6后引入了自适应自旋锁,自旋时间由前一次在同一个锁上的自旋时间和锁的拥有者的状态来决定。

锁消除

虚拟机及时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除。如:字符串通过“+”进行连接的时候,会转换为Stringbuilder,Stringbuilder中的锁可能会被消除。

锁粗化

锁粒度尽可能小,如果Stringbuilder的append()中的锁比较频繁,可能会在整个方法加一次锁。

轻量级锁

1、概述:提升程序同步性能的依据是“对于绝大部分的锁,在整个同步周期内都是不存在竞争的”这一经验法则。如果没有竞争,不同线程可轮流通过轻量级锁,CAS操作成功避免了使用互斥量的开销;但如果确 实存在锁竞争,除了互斥量的本身开销外,还额外发生了CAS操作的开销。因此在有竞争的情况下, 轻量级锁反而会比传统的重量级锁更慢。

2、对象头分为两部分信息,1、用于存储对象自身运行时的数据,如哈希码、GC分代年龄等这部分数据长度在32位和64位虚拟机中分别为32bit和64bit,称作mark word.

3、虚拟机先将在当前线程的栈帧中建立名为锁记录(lock record)的空间,用于存储锁对象目前的mark word的拷贝(displaced mark word),然后虚拟机将cas操作尝试将对象的mark word更新为指向lock record的指针,更新成功,那么这个线程拥有了该对象的锁,对象处于轻量级锁状态。更新失败,会检查对象mark word是否指向当前线程的栈帧,则直接进入同步代码块继续执行。否则说明锁已经被其它线程抢占。如果存在多个线程同时竞争一把锁,轻量锁就会膨胀为重量锁。

在这里插入图片描述

解锁

轻量锁的解锁过程也是利用 CAS 来实现的,会尝试锁记录替换回锁对象的 Mark Word 。如果替换成功则说明整个同步操作完成,失败则说明有其他线程尝试获取锁,这时就会唤醒被挂起的线程(此时已经膨胀为重量锁)

轻量锁能提升性能的原因是:认为大多数锁在整个同步周期都不存在竞争,所以使用 CAS 比使用互斥开销更少。但如果锁竞争激烈,轻量锁就不但有互斥的开销,还有 CAS 的开销,甚至比重量锁更慢。

偏向锁

如果轻量级锁是无竞争情况下使用CAS操作去消除同步使用的互斥量,那偏向锁就是在无竞争环境下把整个同步都消除掉。

偏向锁的特征是:认为锁不存在多线程竞争,并且应由同一个线程多次获得锁。

当线程访问同步块时,会使用 CAS 将线程 ID 更新到锁对象的 Mark Word 中,如果更新成功则获得偏向锁,并且之后每次进入这个对象锁相关的同步块时都不需要再次获取锁了。

在这里插入图片描述

释放锁

当有另外一个线程获取这个锁时,持有偏向锁的线程就会释放锁,释放时会等待全局安全点(这一时刻没有字节码运行),接着会暂停拥有偏向锁的线程,根据锁对象目前是否被锁来判定将对象头中的 Mark Word 设置为无锁或者是轻量锁状态。

轻量锁可以提高带有同步却没有竞争的程序性能,但如果程序中大多数锁都存在竞争时,那偏向锁就起不到太大作用。可以使用 -XX:-userBiasedLocking=false 来关闭偏向锁,并默认进入轻量锁。

乐观锁

对并发操作产生的线程问题持乐观态度,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。

悲观锁

不管三七二十一,直接上独占锁,就像synchronized

分段锁

把一个锁分解为多个锁

分解锁

锁上存在适中而不是很激烈的竞争时,将一个锁分解为两个锁

读写锁

ReentrantReadWriteLock:使用场景是读多写少时。

1、可重入

2、默认是非公平的锁

3、线程持有写锁不能在不释放写锁的情况下获得读锁,反之可以。

4、如果锁由读线程持有,另一个线程请求写锁,那么其他读线程都不能获得读取锁,直到写线程释放写入锁。

机器学习预测股票收益(一)之随机森林模型 机器学习预测股票收益(一)前言一、导入库和数据二、处理数据以及计算特征变量三、使用随机森林回归预测股票收益1.构建训练集和测试集2.查看预测结果四、根据预测结果构建long-short投资组合1.定义投资组合函数2.定义绩效分析函数五、引入Fama-French Factor六、投资组合表现1.超额收益表现2.多因子回归总结 前言 本文将使用Python整理1927-2020年所有美国上市公司股票数据。根据历史收益以及交易量,使用随机森林,支持向量机以及神经网络等机器学习方法预测股票收益。最优结果构建的资产 阅读详情

相关推荐

Immich vs Nextcloud照片管理实测:自建私有云相册到底选哪个?

本文深度评测了Immich与Nextcloud在私有云相册管理中的表现,涵盖核心功能、性能基准、本土化实践及进阶功能。Immich凭借微服务架构和AI优化在照片管理、移动端体验上表现优异,而Nextcloud则强在生态整合。文章还提供了Docker部署优化和国内网络适配方案,帮助用户根据需求选择最佳方案。

seed的博客 330

多线程中的锁

在了解什么是锁之前,我们先来看一下这样一段代码//创建变量i//我们创建两个线程,分别让i自增10000次j < 10000;j++) {i++;});j < 10000;j++) {i++;});t1.start();t2.start();try {//等待两个线程执行完成t2.join();t1.join();//打印i的值按照正常的逻辑,两个线程都让i自增了10000次,i最终的结果应该是20000才对,但事实真是如此吗?我们来看一下代码的运行结果。

qq_66292058的博客 2201

别再凭感觉了!手把手教你用Excel搞定激光器MPE与NOHD安全计算(附模板下载)

本文详细介绍了如何利用Excel自动化计算激光器的MPE(最大允许照射量)和NOHD(标称眼危害距离),提升激光安全评估的效率和准确性。通过实战案例和模板下载,帮助工程师快速掌握GB/T 7247标准中的关键计算,避免常见错误,适用于激光测距仪等设备的安评工作。

weixin_30954265的博客 467

多线程有哪些锁

互斥锁是一种「独占锁」,比如当线程 A 加锁成功后,此时互斥锁已经被线程 A 独占了,只要线程 A 没有释放手中的锁,线程 B 加锁就会失败,于是就会释放 CPU 让给其他线程,既然线程 B 释放掉了 CPU,自然线程 B 加锁的代码就会被阻塞。自旋锁开销少,在多核系统下一般不会主动产生线程切换,但如果被锁住的代码执行时间过长,自旋的线程会长时间占用 CPU 资源,所以自旋的时间和被锁住的代码执行的时间是成「正比」的关系,我们需要清楚的知道这一点。互斥锁虽然简化了使用锁的难度,但是存在一定的性能开销,...

TABE_的博客 2354

angular中访问本地json文件

先在assets文件夹下写一个json文件,这样在打完包之后也可以手动修改json文件内容 1、在需要访问本地json文件的ts文件里面引入 import{HttpClient}from'@angular/common/http'; 2、用ajax请求调用,我这里是用已经封装好的ajax请求调用 gethttp = ()=>{ var self = this self.ajax.getAjax("../../assets/server.json","g...

蜗牛~~ 1830

CMOS传输门(互补开关)实战指南 | 设计优化 + 常见问题解析

本文深入解析CMOS传输门(互补开关)的设计优化与常见问题,涵盖导通特性、版图设计、高频应用及混合信号设计等关键领域。通过实测数据和优化技巧,帮助工程师解决衬底连接、信号完整性等实际问题,提升数字和模拟混合信号设计的效率与可靠性。

weixin_29229989的博客 161

03多线程常见锁

1公平锁、非公平锁 概念:所谓公平锁,就是多个线程按照申请锁的顺序来获取锁,类似排队,先到先得。而非公平锁,则是多个线程抢夺锁,会导致优先级反转或饥饿现象 区别: 公平锁在获取锁时先查看此锁维护的等待队列,为空或者当前线程是等待队列的队列,则直接占有锁,否则插⼊到等待队列,FIFO原则。 非公平锁比较粗鲁,上来直接先尝试占有锁,失败则采⽤公平锁方式。非公平锁的优点是吞吐量比公平锁更大。 synchronized 和 juc.ReentrantLock 默认都是非公平锁。ReentrantLock 在..

技术改变世界 3452

SAP 基于生产订单行项目外部加工创建采购申请时的一个增强需求

摘要 本文介绍在SAP系统中实现生产订单外协工序自动生成采购申请(PR)时,将指定文本写入PR抬头文本的技术方案。关键点包括: 业务背景:通过CO02事务码将工序标记为外部加工,系统自动生成PR,需在生成时自动写入抬头文本。 技术难点: PR抬头文本存储在STXH/STXL而非EBAN表 标准增强点ME_PROCESS_REQ_CUST在外协场景可能不触发 推荐方案: 使用BAdI ME_REQ_POSTED,在PR过账时点执行 通过Text Object EBANH和Text ID(如B01)写入文本 实

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 623

多线程锁syn\lock使用详解

lock和synchronized相比,更能灵活的试算代码片段加锁例如:手把手的进行锁获取和释放,先获得锁A,然后再获取锁B,当获取锁B后释放锁A同时获取锁C,等等代码逻辑枷锁。

qq_44691484的博客 3039

go实现MQTT broker(附完整源码)

go实现MQTT broker(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 577

jdbc从入门到精通(全)

前言 Java语言连接数据库(Java DataBase Connectivity) 面向接口/抽象编程(降低程序的耦合度,提高程序的扩展力)类似多态机制

码农研究僧的博客 1758

多线程线程锁的概念和介绍

在多线程环境下,为了让多线程安全地访问和使用共享变量,必须引入锁机制。锁机制即当一个线程持有锁后,其他线程只能进行等待,直到持有锁的线程释放锁,再次重新竞争锁。

Jay的小提琴的博客 2110

芒果YOLOv10改进31:特征融合Neck篇:改进特征融合网络 BiFPN 结构,融合更多有效特征

YOLOv10改进:特征融合Neck篇:改进特征融合网络 BiFPN 结构,融合更多有效特征

包括YOLOv5、YOLOv7、YOLOv8等模型改进 684

多线程锁的升级原理是什么?

多线程锁的升级原理是什么? 锁的级别从低到高: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 锁分级别原因: 没有优化以前,sychronized是重量级锁(悲观锁),使用 wait 和 notify、notifyAll 来切换线程状态非常消耗系统资源;线程的挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。所以 JVM 对 sychronized 关键字进...

ConstXiong 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【多线程进阶】常见的锁策略和锁的优化机制

本文介绍了多种锁策略及其应用。首先区分了乐观锁与悲观锁:乐观锁假定冲突较少,悲观锁则预期频繁冲突。接着讨论了自旋锁与挂起等待锁,前者适合冲突少且持有时间短的场景,后者适用于长锁持有时间。随后对比了轻量级锁与重量级锁,前者开销小、效率高,后者开销大、效率低。此外,文章还探讨了公平锁与非公平锁的区别,以及可重入锁如何避免死锁。最后介绍了读写锁,其允许多个读操作并发,但写操作独占资源。通过详细解析各种锁机制的特点及适用场景,本文为读者提供了深入理解并发控制的基础。

2202_76097976的博客 2390

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

多线程--锁

锁是一种用于控制多个线程对共享资源访问的同步机制。它的主要作用是确保同一时刻只有一个线程可以访问共享资源,从而避免数据竞争和不一致性问题。

zx733988的博客 1003

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

多线程锁

多线程锁

qq_51626500的博客 601

多线程基础——锁

线程安全是程序设计中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的全局变量,使程序功能正确完成。 假设有间银行只有 1000 元,而两个人同时提领 1000 元时就可能会拿到总计 2000 元的金额。为了避免这个问题,该间银行提款时应该使用互斥锁,即意味着针对同一个资源处理时,前一个人提领交易完成后才处理下一笔交易。但这种手法会使得效能降低。 线程安全的函数一般不应该修改全局对象。 锁的概念 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即

城南孔乙己的专栏 2447

【多线程】锁策略

本文主要讲解锁策略、常见的锁策略(乐观锁和悲观锁、轻量级锁and重量级锁、自旋锁和挂起等待锁、 公平锁和非公平锁 、可重入锁和不可重入锁 、读写锁 ) 以及CAS(CAS的ABA问题、如何解决ABA问题)并提供了一些示例代码以及Synchronized总结

A1546553960的博客 2048

【JUC并发编程06】多线程锁 (公平锁和非公平锁,死锁,可重锁)

文章目录6 多线程锁 (公平锁和非公平锁,死锁,可重锁)6.1 synchronized 锁的八种情况6.2 对上述例子的总结6.3 公平锁和非公平锁6.4 可重入锁6.5 死锁 6 多线程锁 (公平锁和非公平锁,死锁,可重锁) 某一个时刻内,只能有唯一一个线程去访问这些synchronized 方法 所有的 静态同步方法用的也是同一把锁 ——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的,但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放

为了远大的理想,冲锋! 1650

多线程锁状态以及锁升级过程

多线程锁状态图 锁升级的过程(接下来会进行一一解释) 上篇文章介绍的对象内存布局有解释markword 统一解释:偏向锁位以及锁标志位用于区分是哪一种锁状态 一、无锁态 刚new出一个对象,没有线程需要使用这个对象,此时对象的markword对象头8字节中记录的锁信息如下图所示: 二、偏向锁 第一个线程使用这个对象时,会将对象的markword对象头切换为偏向锁状态,如下图所示,其中最关键的标红字段记录了当前线程的指针,表明当前对象被锁住,只偏向于当前线程。 三、轻量级锁 当有任何一个线程开始竞争该

a1290320893的博客 287

多线程与锁

Java多线程与并发编程总结 线程通信:notify()随机唤醒一个等待线程,notifyAll()唤醒所有等待线程。wait()释放锁并进入等待,需外部唤醒;sleep()不释放锁,时间到自动唤醒。 锁机制: synchronized:基于Monitor实现,含偏向锁、轻量级锁(CAS)、重量级锁三级升级,保证原子性但性能受限。 ReentrantLock:基于AQS实现,支持公平/非公平锁、可中断、超时等特性,需手动释放锁。 线程安全: CAS:乐观锁思想,通过Unsafe类调用底层指令。 volati

m0_65982521的博客 1490

java多线程之锁的应用

锁 锁应用于java多线程中的同步机制,我们知道线程安全的问题大部分是由于多个线程并发的访问共享变量或共享数据。于是我们想到将并发访问变为串行访问,既一次只能有一个线程访问共享数据。这就是锁的思想 如果你学过操作系统的多线程同步机制的话,相信你会对这部分有更好的理解。在操作系统中,多线程的同步是通过p,v原语,既waite(),signal()来解决线程同步问题,在访问临界区之前,所谓临界区就是p,v原语中间的代码,我们首先要对线程进行资源的申请操作p,访问结束后我们使用v归还资源。 java多线程中的锁的

weixin_43747389的博客 1527

多线程之锁策略

锁策略是指在多线程或多进程环境中,用于控制共享资源并发访问的一种机制。它可以确保在同一时间只有一个线程或进程可以访问共享资源,从而避免竞争条件和数据不一致的问题。(锁内部处理加锁冲突涉及的一些不同解决方法)

ltzoro的博客 558

C++ 多线程编程-各种锁

上边这个表可以看出来,shared_lock与unique_lock的接口一模一样,他们唯一的区别在于,unique_lock是以排他式上锁,同一时刻只允许一个线程获取锁;比如网吧,就那么多位置,满了网管就不会给你开机子,必须等有人下机才能上机,这里的网吧就是共享资源,他有并发数量限制,网管就类似信号量的功能,限制网吧的同时访问数量。:shared_mutex算是对unique_lock的补充,因为unique_lock在存在多个只读线程的情况时,会有较大的性能损失,因为只读线程之间加锁是不必要的。

weixin_57011178的博客 1457

多线程-公平锁与非公平锁

2.什么是公平锁与非公平锁? 公平锁和非公平锁其实说的是获取锁的机会是不是对每个等待线程都公平。 这就好比一群学生都在竞争一个答题名额: 每次都是同一个学生抢到,这对其他学生不公平。 公平锁就是获取锁的机会对每个等待线程都公平。 非公平锁就是获取锁的机会对每个等待线程都不公平。 3.隐式锁非公平锁例子 我们先来看看非公平锁的例子,然后下一小节将非公平锁的例子改写为公平锁。 ...

天道酬勤 630
上一篇: JMM作用和原理
下一篇: 面试题
九号铅笔芯
博客等级 码龄9年 9粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值