关于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对进行了优化,引入了锁升级机制。锁升级是指锁从偏向锁到轻量级锁,再到重量级锁的动态升级过程。锁升级的目的减少锁的开销,提升性能根据竞争情况动态调整锁的级别。 阅读详情

相关推荐

HALCON卡尺模型实战:5分钟搞定工件尺寸测量(附完整代码)

本文详细介绍了HALCON卡尺模型在工件尺寸测量中的实战应用,通过5分钟快速搭建测量系统的完整指南,包括基础配置、高级参数调优和完整代码示例。卡尺模型能自动识别边缘并计算精确尺寸,显著提升工业视觉检测的效率和一致性,特别适用于实时测量场景。

weixin_42570296的博客 462

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

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

weixin_62827806的博客 1008

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

qq_45634989的博客 2878

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

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

胡晗靓的Java学习博客 1419

数学之美 | 图论和网络爬虫

文章目录概述图论网络爬虫分析BFSDFSBFS + DFS参考资料 概述 这篇文章主要给大家介绍一下计算机算法中非常重要的一部分——图论,以及它在生活中的应用——网络爬虫。   图论 离散数学是当代数学的一个重要的分支,也是计算机科学的数学基础。它又包括四个分支,而图论便是其中一支,另外三个分别是:数理逻辑、集合论、近代数学。 图论中的图由一些节点和边构成,比如下面这张图 。 在图论中一个很基础...

小小酥梨的博客 3231

H3C BGP联盟实验

bgp,bgp联盟,bgp公认团体属性,

一只懒羊羊 970

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

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

吴名氏的博客 12万+

【Docker】一招解决超时镜像超时报错:`ERROR: Get https://registry-1.docker.io/v2/`

Docker 镜像拉取超时或失败并不是 Docker 本身的缺陷,而是网络环境和默认配置在特定场景下的限制所导致的结果。通过本文的分析可以看到,问题的核心往往集中在三个方面:网络访问延迟、DNS 解析速度以及客户端默认超时时间。针对这些问题,最直接、有效的做法是使用国内镜像加速器,这不仅能够显著提升拉取速度,还能保证在企业内网或家庭网络中更加稳定

博客 1027

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

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

逆水行舟,不进则退 3143

MFC实现简单UDP通信(附完整源码)

MFC实现简单UDP通信(附完整源码)

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

【数据分析】R语言分段结构方程模型手把手教程(Piecewise Structural Equation Model)

分段结构方程模型(Piecewise Structural Equation Model, SEM)是一种用于分析变量之间因果关系的统计方法。它通过将复杂的因果关系分解为多个简单的线性模型来评估变量之间的直接和间接效应。与传统的结构方程模型(SEM)不同,分段结构方程模型不需要假设数据的多变量正态分布,因此在处理非正态数据时更为灵活。

专注生信领域 2648

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

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

学习猴 1万+

【光子AI / Photon.AI】manus 通用 Agent 的实现核心技术原理与应用

摘要 Manus是一款由国内团队开发的通用AI Agent,其核心技术原理基于多智能体协作架构、云端全能沙箱、规划-执行-反思循环等系统工程方法。与传统的对话式AI不同,Manus能够在独立的Linux虚拟机环境中自主规划并执行复杂任务,通过编写和运行代码来解决问题,具备强大的纠错能力和工具使用能力。 核心应用场景包括深度行业研究、自动化办公、生活助理、辅助编程和跨平台信息整合等。Manus的工程化落地优势体现在沙箱环境、多智能体调度和容错机制等方面,使其能够完成需要多步骤操作和多种工具调用的复杂任务,将A

AI天才研究院 667

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

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

AI天才研究院 9409

Devexpress16.2.6破解工具

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

qq_44850917的博客 1004

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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

daydayup 2777

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、付费专栏及课程。

余额充值