关于Java 偏向锁,轻量级锁,重量级锁的应用和区别,优点和缺点

无锁、偏向锁、轻量级锁、重量级锁 超千万千万 阅读详情

 

 

1,偏向锁。

        偏向锁:顾名思义,偏心与某一个线程锁,而他偏心的线程就是第一个访问该锁的线程,在某个锁第一次被一个线程所访问的时候,该锁对象会在它的Mark Word中记录该线程的线程id,而在该线程第二次去访问这个锁的时候,只需进行一次CAS操作,去检验该线程是不是他所偏向的锁(其实就是检测Mark Word中保存的线程id是否和当前线程所匹配),那么该线程访问临界资源的时候,不需要复杂的CAS操作,并且在偏向锁的时候是,是不会触发同步的。

        偏向锁的使用,在单线程(某一线程)重复访问某段临界资源,可以看做没有并发发生,无需上下文切换和CAS操作,提高了效率。但是它的适用情况当然也是单线程资源访问,如果在使用偏向锁的时候,有其他资源竞争,那么偏向锁会升级成为轻量级锁,增加额外的锁撤销的消耗且不可降级。

2,轻量级锁。

         轻量级锁锁允许多个线程并发访问锁,在获取锁成功的时候,执行同步代码,获取锁失败,自旋获取锁,自旋失败的情况下,锁膨胀成为重量级锁。

        轻量级锁在获取锁的过程:

        线程在执行同步代码之前,JVM会在当前线程的栈帧中创建一个空间用来存储锁记录,然后把对象头的Mark Word复制到该锁记录中,然后尝试使用CAS将对象头中的Mark Word 替换成指向锁记录的指针,

        如果成功则持有锁的线程执行同步代码,执行完CAS替换Mark Word成功释放锁,如果CAS成功,线程结束,CAS失败说明期间有线程尝试获得锁并自旋失败,轻量级锁升级成为了重量级锁。

        如果失败,线程自旋,自旋成功则获得锁,自旋失败,则膨胀成为重量级锁,线程阻塞。(对象头锁标志位改变。MarkWord改变);

        轻量级锁在竞争锁的时候不会阻塞,提高了程序的响应速度,但是在一直不能获取锁的时候会自旋消耗cpu,使用场景:追求响应速度,同步块执行速度非常快的情况下(临界资源需要执行时间比较短),程序不会因为长时间自旋等待锁,而自旋失败

3,重量级锁。

   代表Synchronized锁

 Synchronized内部实现过程

      Waiting Queue 等待队列 

            ContentionList:竞争队列,所有请求锁的线程在一开始自旋获取锁的时候,获取失败的线程会被放到这和队列中。

            EntryList:Contention List 中有资格成为候选资源的线程会被移动到Entry List 中。

      Runnable Thread (ready thread)

            OnDeck:任意时刻,最多只有一个线程正在竞争资源,该线程被叫做OnDeck(准备齐全)

      Running Thread

            Owner:当前已经获得锁资源的线程被称为Owner.

            !Owner:当前释放锁的线程。

 WaitSet队列是Owner线程被阻塞之后进入的队列,如果线程被唤醒notify,线程将重新进入Entry Set.

Synchronized 具体实现过程:

        JVM每次从队列的尾部去除一个线程用于竞争候选者(OnDeck),但是在并发情况下,Contention List 会被大量的线程进行CAS访问,为了降低对尾部元素的竞争,JVM会将一部分线程移动到Entry List中作为候选竞争线程(Ondeck)在Owner线程在unlock时,Owner线程并不直接把锁传递给OnDeck线程,而是把锁竞争的权利交给Ondeck线程,OnDeck线程会重新竞争锁。这样虽然牺牲了一些公平性,但是能极大提升系统的吞吐量,在jvm中也将这种行为称为竞争切换。

        OnDeck线程在获取锁资源之后会编程Owner线程,而没有得到锁资源的让然停留在Entry List,如果Owner线程被阻塞,则转移到WiteSet队列中,直到某个时刻通过notify或者notiyAll唤醒,会重新进去Entry List.

         处于ContrntionList,Entry List,WaitSet中的线程都处于阻塞状态,该状态是由操作系统实现的。

 Synchronized锁是不公平的锁:

                            1,对于刚进来过去synchronized锁的线程(在进入ContentionList队列之前),先通过自旋获取锁,如果自旋获取锁失败,则进入Contention List,这明显对于已经进入队列的线程是不公平的。

                            2,在刚进入的线程自旋的时候,可能直接抢占OnDECK线程的锁资源。

 

4,自旋锁。

         如果持有锁的线程在很短时间内释放资源,那么那些等待的线程就不用做内核态和用户态之间的切换进入阻塞挂起状态,他们只需等一等,等持有锁的线程释放锁之后可立即获取锁,这样就可以避免用户线程和内核线程的切换的消耗。

         其实等同于说自旋就是让CPU做无用功,所以需要设定一个自旋等待的最大时间。(基本认为一个线程上下文切换的时间是最佳的一个时间,是由前一次在同一个锁上的自旋时间以及锁的拥有者状态来决定的)

如果持有锁的线程执行的时间超过自旋等待的最大时间仍然没有释放锁,就会导致其他竞争锁的的线程进入阻塞状态。

        自旋锁的优点:自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能大幅度提升,因为自旋的消耗会小于线程阻塞挂起操作的消耗。

        自旋锁的缺点:如果锁的竞争非常的激烈,或者持有锁的线程需要长时间占用锁执行同步快,这个时候就不时候适合使用自旋锁,因为在自旋锁获取锁之前cpu一直在做无用功,线程自旋的消耗大于线程阻塞挂起操作的消耗,其他需要cpu的线程又不能获取cpu,造成cpu的浪费。

5,可重入锁:Java中的可重入锁,synchronized和ReentrantLock

        Synchronized在java中是隐式的可重入锁,ReentrantLock是显式的可重入锁

       可重入锁的意思是在一个线程持有该锁的时候,当递归获取或者重复获取该锁的时候,该线程不会被阻塞,而是再次可以获得锁去访问临界资源。

        而实现可重入锁是在锁中有一个计数的count变量,在该线程再次获取锁的时候,并发锁先去判断要获取锁的线程是否是当前持有锁的线程,若不是,则阻塞线程,若是,则count++;

在释放锁的时候,判断当前线程是否是持有锁的线程,然年后进行count--;

Count = 0 则锁被完全释放;

https://www.cnblogs.com/charlesblc/p/5994162.html

深入理解synchronized锁升级:从偏向锁到重量级锁 是Java中用于实现线程同步的关键字。为了提高性能,JVM对进行了优化,引入了锁升级机制。锁升级是指锁从偏向锁到轻量级锁,再到重量级锁的动态升级过程。锁升级的目的减少锁的开销,提升性能根据竞争情况动态调整锁的级别。 阅读详情

相关推荐

Polyworks脚本开发实战指南:高效生成数据彩图与报告的关键指令解析

本文深入解析了Polyworks脚本开发中生成数据彩图与自动化报告的核心指令。通过实战案例,详细介绍了REFERENCE_SURFACE、THICKNESS和CLEARANCE等关键彩图生成指令的正确用法与常见避坑点,并阐述了如何利用REPORT_ITEM命令实现从截图、表格生成到智能排版的全流程自动化,旨在帮助三维检测与质量控制工程师大幅提升工作效率与报告标准化水平。

weixin_29209825的博客 555

面试专栏:可重入锁和偏向锁

这意味着如果一个线程已经持有某个锁,它可以再次进入被这个锁保护的其他同步代码块而不会发生死锁。可重入锁是一种允许线程重复进入同一段同步代码的锁。偏向锁是Java虚拟机(JVM)在轻量级锁机制中的一种优化策略,旨在减少无竞争情况下的同步开销。:当锁首次被线程获取时,锁会偏向于该线程。:如果出现另一个线程尝试获取偏向锁,偏向模式会被撤销,锁升级为轻量级锁或重量级锁。:在偏向模式下,锁操作不需要进行昂贵的原子操作,因为假设锁不会被其他线程竞争。允许创建公平锁,其中等待时间最长的线程优先获得锁。

weixin_62827806的博客 1008

EB tresos配置指南:CAN通信信号收发全流程解析

本文详细解析了使用EB tresos配置工具实现AUTOSAR架构下CAN通信信号收发功能的全流程。从环境准备、COM模块信号定义、PduR路由配置、CanIf硬件抽象到CAN驱动层设置,提供了清晰的步骤指南和关键配置要点,帮助开发者快速打通从应用层到物理层的数据链路,实现可靠的CAN通信。

weixin_29192141的博客 508

Java中,什么是偏向锁和轻量级锁?

Java中,什么是偏向锁和轻量级锁?

胡晗靓的Java学习博客 1419

时序分析-由D触发器结构来理解Tsu、Th

FPGA逻辑单元内的D触发器(D-FF)是一种在时钟的上升沿(或下降沿)将输入信号的变化传送至输出的边沿触发器。 数字电子技术基础-闫石(第五版)边沿D触发器内部结构见下图: 而FPGA原理与结构(日)一书中,内部结构较之上图多了俩反相器: 由传输门和俩个反相器组成一个循环电路(锁存器),再由前后两级锁存器按主从结构链接而成。这里的传输门起开关作用,随着CLK的状态变化切换开关。只看输出的话,前级锁存器的值会随着时钟输入的变化井然有序地传入后级锁存器。为了防止时钟信号变化时输入信号发生冒险,从而使稳定.

XY_Chang的博客 3973

告别抖动与滞后:深入博能传动伺服DSC功能,用105报文提升多轴同步性能

本文深入解析博能传动伺服DSC功能如何通过105报文实现多轴同步性能提升,有效解决工业自动化中的抖动与滞后问题。详细介绍了DSC技术原理、105报文实现机制及多轴同步工程实践,帮助工程师优化伺服系统性能,实现绝对齿轮同步。

weixin_30394981的博客 184

偏向锁、轻量级锁、重量级锁的区别和解析

偏向锁、轻量级锁、重量级锁的区别和解析

吴名氏的博客 12万+

从零开始学嵌入式之STM32——1.什么是STM32

它是ST公司推出的一系列单片机的统称。ST----指的是ST公司----意法半导体。意法半导体,成立于1987年,是由意大利的SGS微电子公司和法国的Thomson半导体公司合并而成。ARM目前主要是ARM架构处理器及外围组件的电路设计方案,知识产权授权的形式收取费用,其他公司根据ARM的方案设计出CPU产品。,它以应用为核心,软硬件可裁剪,旨在实现对设备的控制、监测或辅助功能,区别于通用计算机(如 PC、服务器)的 “一机多用” 属性。在嵌入式领域,目前主流的是cortex-M3内核推出的芯片。

qshdyy的博客 1854

偏向锁,轻量级锁,重量级锁的区别

偏向锁 偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。 轻量级 轻量级锁是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。 重量级锁 重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀...

逆水行舟,不进则退 3143

无人机避障——感知篇(采用Mid360复现Fast-lio)

本文介绍了在Ubuntu 18.04和ROS Melodic环境下,使用Xavier-nx电脑和Livox Mid-360激光雷达编译和运行FAST-LIO工程的步骤,包括创建工作空间、编译驱动和FAST-LIO源码,以及运行launch文件进行建图的过程。

weixin_45390670的博客 3546

【异常】Milvus 向量数据库字段缺失错误分析与解决 MilvusVectorStoreServiceV2 - Failed to insert batch [0-1]: The field:

本文分析了Milvus向量数据库插入操作中出现的字段缺失错误。错误显示age_mode字段未提供,导致批量插入失败。根本原因是Milvus Schema要求所有定义字段必须存在,但代码中对部分字段采用条件添加方式。解决方案是将条件添加改为始终添加,为可能为null的字段提供空字符串默认值。文章总结了Schema约束、防御性编程等经验,并建议通过Schema变更检查、单元测试覆盖和数据校验层等预防措施避免类似问题。该问题影响product、mac、source等多个字段,修改后确保了数据插入的可靠性。

奶爸的编程之路,也就一周冷个三天 406

synchronized中重量级锁、偏向锁和轻量级锁的区别

Java1.5之前synchronized是一个重量级锁,Java 1.6对synchronized进行的各种优化后,synchronized并不会显得那么重了。我们先介绍重量级锁,然后介绍优化后的轻量级锁和偏向锁。 0.对象头以及Mark Word 1重量级锁 重量级的synchronized有三个用法: 普通同步方法,锁的是当前实例对象。 静态同步方法,锁的是当前类的clas...

学习猴 1万+

ABAP Bits and Bytes 完全参考,理解内存、字节、位运算与类型解释

ABAP开发中业务代码与底层字节处理的差异:业务层关注采购订单、会计凭证等语义信息,而接口开发需处理十六进制、位运算等底层操作。文章通过整数变量示例说明同一段字节在不同类型解释下会呈现不同值,并介绍x类型、位运算及类型转换的实际应用。这些知识在文件接口、加密传输等场景中尤为重要,开发者需注意字节序、编码等问题。建议将底层协议处理与业务逻辑分离,以保持代码清晰和可维护性。

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

偏向锁、轻量级锁、重量级锁、自旋锁、自适应自旋锁

1. 偏向锁 偏向锁就是在运行过程中,对象的锁偏向某个线程。即在开启偏向锁机制的情况下,某个线程获得锁,当该线程下次再想要获得锁时,不需要重新申请获得锁(即忽略synchronized关键词),直接就可以执行同步代码,比较适合竞争较少的情况。 偏向锁的目标是,减少无竞争且只有一个线程使用锁的情况下,使用轻量级锁而产生的性能消耗。轻量级锁每次申请、释放锁都至少需要一次CAS,但偏向锁只有初始化时需要...

AI天才研究院 9409

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JUC-synchronized无锁、偏向锁、轻量级锁、重量级锁

synchronized无锁、偏向锁、轻量级锁、重量级锁。详细说明了锁的升级过程。

qq_44850917的博客 1004

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Java】常见锁策略 && CAS机制 &&锁优化策略

synchronized是非公平锁,也就是机会均等的竞争锁。

daydayup 2777

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java中的锁详解篇

在Java中的锁主要是用于保障线程在多并发的情况下数据的一致性。就是实现并发的原子性。在多线程编程中为了保证数据的一致性,我们通常需要在使用对象或者调用方法之前加锁,这时如果有其他线程也需要使用该对象或者调用该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会进入阻塞队列等待锁的释放,直到其他线程执行完成并释放锁,该线程才有机会再次获取锁并执行操作。这样做可以保障了在同一时刻只有一个线程持有该对象的锁并修改该对象,从而保障数据的安全性。在Java当中有很多锁的名次,这些并不时全指锁,有的指所得

古城的博客 6379

【JUC并发编程】synchronized原理分析(上)(偏向锁/轻量级锁/重量级锁/手写重入锁)

目录一、synchronized前置知识二、重入锁1. 演示重入锁2. 改造重入锁代码三、轻量级改造重量级锁 一、synchronized前置知识 偏向锁→轻量锁(cas自旋)→重量级锁 重入锁概念/悲观锁与乐观锁 基于CAS手写-重入锁 基于CAS手写类似synchronized锁的升级过程 补充概念: 偏向锁: 同一个线程在没有其他线程竞争锁的情况下,可以一直复用我们的锁,不会重复获取锁。 轻量锁: 多个线程同时获取锁,只有一个线程获取锁,没有获取到锁的线程会通过CAS不断重试(可以配置重试次数

记录各种Bug解决案例及日常学习内容 689

Java多线程下——各类锁的详解

假设男主是一个锁, 女主是一个线程. 如果只有这一个线程来使用这个锁, 那么男主女主即使不领证结婚(避免了高成本操作), 也可以一直幸福的生活下去.但是,但是,但是,女配出现了, 也尝试竞争男主, 此时不管领证结婚这个操作成本多高, 女主也势必要把这个动作完成了, 让女配死心.比如一个递归函数里有加锁操作,递归过程中这个锁会阻塞自己吗?实际开发过程中, 使用细粒度锁, 是期望释放锁的时候其他线程能使用锁,但是实际上可能并没有其他线程来抢占这个锁. 这种情况 JVM 就会自动把锁粗化, 避免频繁申请释放锁..

weixin_45696320的博客 3562

JAVA基础面试题:Java中的偏向锁(Biased Locking)与轻量级锁的性能优化机制及其在高并发场景下的应用

本次面试围绕Java中的偏向锁和轻量级锁展开了深入讨论,涵盖了它们的工作原理、适用场景、优缺点以及设计思想。通过这些技术点的分析,可以更好地理解JVM在高并发场景下的性能优化机制。

qq_61302385的博客 916

悲观锁,乐观锁,自旋锁,偏向锁,轻量级锁,CAS,版本号机制总结

其中包括悲观锁,乐观锁以及两者的实现方式,包括自旋锁,自适应自旋锁,偏向锁,轻量级锁,重量锁,版本号机制,CAS操作。

下雨了_简的博客 1078

JAVA的三种锁机制:偏向锁、CAS自旋锁、重量级锁(阻塞锁)

JAVA的三中锁机制: 一、偏向锁: ​ 持有偏向锁的线程第一次进入的时候需要加锁,当第二次进入的时候不需要加锁,类似于看门大爷偷偷为你走后面,第一次来的时候需要通行证,之后就不需要通行证一样放你进来。 ​ 偏向锁运行的时候如果遇到抢占锁(优先级更高的锁),则偏向锁会被挂起。 二、CAS(comparent and swap)自旋锁: ​ Lock锁,属于CAS自旋锁,原理简化理解为在一定时...

方木的博客 1419

java锁的分类

乐观锁不会添加锁,无锁算法,没有线程被阻塞。悲观锁拿到资源就加锁,线程被阻塞。乐观锁:CAS算法 Compare-And-Swap(比较并交换)的缩写,轻量级锁。Java中,synchronized关键字和Lock的实现类都是悲观锁。乐观锁适合读操作多的场景,悲观锁适合写操作多的场景。

Mr. Ding的小博客 990

带你了解 java 各种锁

公平锁和非公平锁 公平锁:是指多个线程按照申请锁的顺序来获取锁,类似排队等车,先来后到。 非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程先申请的线程优先获取锁。在高并发的情况下,有可能会造成优先级反转或者饥饿现象。 两者区别 公平锁:就是很公平,在并发情况下,每个线程在获取锁时会查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己。 非公平锁:先尝试占有锁,如果尝试失败,就再采取类似公

Venus's Blog 1万+

Java常见锁 【超全面】

JAVA锁

玩转Java 1万+

Java中的锁分类的介绍 —— 公平锁/非公平锁、可重入锁、自旋锁、读写锁、分段锁、偏向锁等

文章目录1、乐观锁/悲观锁2、公平锁/非公平锁3、独享锁/共享锁4、可重入锁5、自旋锁6、互斥锁/读写锁7、分段锁8、偏向锁/轻量级锁/重量级锁 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 乐观锁/悲观锁 公平锁/非公平锁 独享锁/共享锁 可重入锁 自旋锁 互斥锁/读写锁 分段锁 偏向锁/轻量级锁/重量级锁 上面是很多锁的名词,这些分类...

猎人在吃肉 1183
上一篇: Spring MVC + MyBatis整合配置
下一篇: 关于URI 和URL 的区别
Embra_ce
博客等级 码龄9年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值