一文打通锁升级(偏向锁,轻量级锁,重量级锁)

news2024/11/25 0:35:04

前置知识:synchronized

 在JavaSE1.6以前,synchronized都被称为重量级锁。但是在JavaSE1.6的时候,对synchronized进行了优化,引入了偏向锁和轻量级锁,以及锁的存储结构和升级过程,减少了获取锁和释放锁的性能消耗,有些情况下它也就不那么重了。

在同步方法中,使用了flag标记ACC_SYNCHRONIZED,当调用方法时,调用指令会检查方法的ACC_SYNCHRONIZED访问标志是否设置。如果设置了,执行线程先持有同步锁,然后执行方法,最后在方法执行完毕释放锁。

同步代码块是使用monitorenter和monitorexit指令进行同步的。monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象都有一个monitor与之关联,并且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象的monitor所有权,即尝试获取对象的锁。

 synchronized锁升级

synchronized锁优化的背景:
用锁能实现数据的安全性,但是会带来性能下降。
无锁能够基于线程并行提升程序性能,但是会带来线程安全性下降。synchronized锁:根据对象头的mark word 锁标志位来确定当前属于哪一种锁。

 为什么会存在锁升级现象?

在java5及其以前,只有synchronized,这个是重量级锁,是操作系统级别的重量级操作。假如锁的竞争比较激烈,性能下降。因为存在用户态和内核态之间的转换。

java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。

发布Java早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(montor)是依赖于底层的操作系统的MutexLoCK(系统工斥量)来实现的,挂起线程和恢复线程都需要转入内核态去完成,阻塞或唤醒一个Java线程需要换作系统切换CPU状态来完成,这种状态切换需要耗费处理器时间,如果同步代码块中内容过于简单,这种切换的时间可能比用户代码执行的时间还长”,时间成本相对较高。这也是为什么早期的synchronized效率低的原因Java 6之后,为了减少获得锁和释放锁所带来的性能消耗,引入了轻量级锁和偏向锁

偏向锁

顾名思义,它会偏向于第一个访问锁的线程

当一段同步代码一直被同一个线程多次访问,由于只有一个线程那么该线程在后续访问时便会自动获得锁,在多线程的情况下,锁不仅不存在多线程竞争,还存在锁由同一个线程多次获取,偏向锁解释在这种情况下出现的,她的出现是未来解决只有在一个线程执行同步时提高性能

  • 如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。线程第二次到达同步代码块时,会判断此时持有锁的线程是否就是自己,如果是则正常往下执行。由于之前没有释放锁,这里也就不需要重新加锁。如果自始至终使用锁的线程只有一个,很明显偏向锁几乎没有额外开销,性能极高。(避免了线程的上下切换),也即偏向锁在资源没有竞争情况下消除了同步语句,懒的连CAS操作都不做了,直接提高程序性能。
  • 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。偏向锁通过消除资源无竞争情况下的同步原语,进一步提高了程序的运行性能。一旦有第二个线程加入锁竞争,偏向锁就升级为轻量级锁(自旋锁)。升级为轻量级锁的时候需要撤销偏向锁,撤销偏向锁的时候会导致STW(stop the word)操作;

 

实际上偏向锁在JDK1.6之后是默认开启的,但是启动时间有延迟(4秒),
所以需要添加参数-XX:BiasedLockingStartupDelay=0,让其在程序启动时立刻启动 

开启偏向锁:

-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0

关闭偏向锁:关闭之后程序默认会直接进入------->轻量级锁状态

-XX:-UseBiasedLocking

 

轻量级锁

多线程竞争,但是任意时刻最多只有一个线程竞争,即不存在锁竞争太过激烈的情况,也就没有线程阻塞。

有线程来参与锁的竞争,但是获取锁的冲突时间极短。本质就是自旋锁CAS

主要目的: 在没有多线程竞争的前提下,通过CAS减少重量级锁使用操作系统互斥量产生的性能消耗,说白了先自旋,不行才升级阻塞。

升级时机:当关闭偏向锁功能或多线程竞争偏向锁会导致偏向锁升级为轻量级锁

假如线程A已经拿到锁,这时线程B又来抢该对象的锁,由于该对象的锁已经被线程A拿到,当前该锁已是偏向锁了。而线程B在争抢时发现对象头Mark Word中的线程ID不是线程B自己的线程ID(而是线程A),那线程B就会进行CAS操作希望能获得锁。

此时线程B操作中有两种情况:

如果锁获取成功,直接替换Mark Word中的线程ID为B自己的ID(A→B),重新偏向于其他线程(即将偏向锁交给其他线程,相当于当前线程“被“释放了锁),该锁会保持偏向锁状态,A线程Over,B线程上位;

如果锁获取失败,则偏向锁升级为轻量级锁(设置偏向锁标识为0并设置锁标志位为00),此时轻量级锁由原持有偏向锁的线程持有,继续执行其同步代码,而正在竞争的线程B会进入自旋等待获得该轻量级锁。

Java6之前

默认启用,默认情况下自旋的次数是10次,或者自旋线程数超过cpu核数一半。

Java6之后

变为自适应自旋锁。意味着自旋的次数不是固定不变的,而是根据:拥有锁线程的状态来决定,或者同一个锁上一次自旋的时间。

线程如果自旋成功了,那下次自旋的最大次数会增加,因为JVM认为既然上次成功了,那么这一次也很大概率会成功。反之,如果很少会自旋成功,那么下次会减少自旋的次数甚至不自旋,避免CPU空转。

重量级锁

适用于:有大量的线程参与锁的竞争,冲突性很高。

重量级锁原理

Java中synchronized的重量级锁,是基于进入和退出Monitor对象实现的。在编译时会将同步块的开始位置插入monitor enter指令,在结束位置插入monitor exit指令。

当线程执行到monitor enter指令时,会尝试获取对象所对应的Monitor所有权,如果获取到了,即获取到了锁,会在Monitor的owner中存放当前线程的id,这样它将处于锁定状态,除非退出同步块,否则其他线程无法获取到这个Monitor。

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

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

相关文章

Hbase1.1:Hbase官网、Hbase定义、Habse结构、Hbase依赖框架、Hbase整合框架

这里写自定义目录标题Hbase官网Hbase特点:大Hbase定义Habse结构Hbase依赖框架hadoopHbase整合框架PhoenixHiveHbase官网 Hbase官网地址 HBase是Hadoop database,一个分布式、可扩展的大数据存储。 当您需要对大数据进行随机、实时读/写访问时&#xf…

记录网关zuul处理跨域/XSS问题

一,疑问 1.之前遇到跨域问题是在NG中解决的,添加跨域请求头和域名配置。那么与网关处理跨域问题关系是什么,NG处理了,为什么还需要在网关中处理 二,前置知识 zuul概念与原理 zuul 的概念和原理 - 知乎 Zuul工作原…

接触过的第一台电脑-90年代的x86与如今的树莓派

#勤写标兵挑战赛#最早接触电脑是在幼儿园,那时候电脑下象棋都要输入命令行的。后来小学时候有了电脑课,要穿鞋套的。满满的回忆。那个时代电子产品更新很慢的,一台电脑可以用5年,286-386-486-586。486电脑的特点是:处理…

python数据分析-matplotlib散点图-条形图的绘制以及完整方法归纳02

matplotlib的基本使用02一.散点图的绘制二.散点图绘图步骤及案例解析1.导入模块2.设置散点图所有字符的字体样式3.编写主体代码4.主题代码解析5.图形展示三.条形图的绘制四.条形图案例展示1.导入模块五.绘制条形图完整代码六.条形图展示七.多个条形图展示1.结果展示八.总结一.散…

工业交换机与商业交换机区别对比

摘要:工业交换机和商业交换机在功能方面差距较小,性能方面差别很大。最主要的差别是在对各类环境的适应性上,包括在温度、湿度、盐雾环境、振动环境、恶劣电磁干扰环境、海拔等各类环境下稳定可靠提供功能服务的能力。当然工业交换机在一些告…

Word控件Spire.Doc for .net 功能详解

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

继续Stable-Diffusion WEBUI方方面面研究(内容索引)

文章目录(零)前言(一)绘图(1.1)模型(1.1.1)基础模型(Stable-diffusion模型)(1.1.2)人物模型(LoRA模型)&#x…

4.4、网络模型

4.4、网络模型1.OSI七层参考模型2.TCP/IP四层模型①简介②四层介绍1.OSI七层参考模型 七层模型,亦称 OSI(Open System Interconnection)参考模型,即开放式系统互联。参考模型是国际标准化组织(ISO)制定的一…

实验1 MATLAB环境与运算基础

实验一一、实验的目的与要求二、实验原理三、实验仪器四、实验内容与步骤五、实验分析与总结一、实验的目的与要求 1、掌握 MATLAB环境与基本操作; 2、掌握 MATLAB常见数据类型的创建、表示和引用; 3、熟悉 MATLAB数据类型的各种运算与常用函数&#xf…

一篇文章让你搞懂TypeScript中的typeof()、keyof()是什么意思

TypeScript中的typeof()、keyof()是什么意思?知识回调(不懂就看这儿!)场景复现核心干货👇👇👇举例引入字面量类型(literal types&…

AC7811电机驱动方案—电路分析

目录 电源树 12V转5V 输出电压设计 电感的选取 欠压锁定 电容的选取 PCB布局 5V转3.3V 输出噪声 外部反向电压保护 接口电路设计 USB转串口 JTAG 驱动电路 驱动桥电路 采样回路设计 电源树 12V转5V 使用了MPQ4420作为电压转换芯片。 芯片手册经典应用 输出电…

Kafka——概述、安装及命令行操作

文章目录一、概述1.1、定义1.2、如何运作?1.3、传统消息队列的应用场景1.4、消息队列的两种模式1.5、Kafka的基础架构二、安装(需要安装zookeeper)三、常用命令行操作3.1、主题命令行操作3.2、生产者命令行操作3.3、消费者命令行操作一、概述…

Python操作MySQL就是这么简单

Python操作MySQL就是这么简单下载MySQL 8.0安装MySQL 8.0步骤2:选择安装类型步骤3:选择安装位置步骤4:配置MySQL 8.0步骤5:安装MySQL 8.0步骤6:完成安装启动MySQL 8.0MySQL 8.0的常用命令python的 pymysql库操作方法安…

【C++】哈希的应用 -- 位图

文章目录一、位图的引入二、位图的实现三、bitset四、位图的应用五、哈希切割一、位图的引入 我们通过一道面试题来引入位图: 给定40亿个不重复的无符号整数,且没排过序,现在给一个无符号整数,如何快速判断一个数是否在这40亿个数…

ChatGPT想干掉测试人员,做梦去吧

很多人都发现ChatGPT可以做一些代码相关的工作,不仅可以写一些测试用例和自动化脚本,还可以做一定量的调优,于是就开始担忧起来,到哪天我的测试工作会不会被ChatGPT这个工具给取代了? 1. ChatGPT目前对哪些东西会有冲击…

Java:Arrays类

1、Arrays是啥&#xff1f; 数组操作工具类&#xff0c;专门用于操作数组元素的。 2.Arrays类的常用API 方法说明public static String toString(类型[] a)对数组进行排序public static void sort(类型[] a)对数组进行默认升序排序public static <T> void sort(类型[]…

图像分割——交叉熵损失

一、前言 写这篇博客的目的主要有两点&#xff0c;首先一点就是&#xff0c;以为对于交叉熵学过就会了&#xff0c;当初笔记也没有详细写过&#xff0c;但今天看论文发现里面的公式没有看懂才发现自己了解的还不够&#xff0c;平时用也是直接用的框架&#xff0c;原来一直认为会…

Java基础--数据结构

阅读目录 目录 数据结构 Java 集合框架 List Set Map 数据结构 Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类&#xff1a; 枚举&#xff08;Enumeration&#xff09;、位集合&#xff08;BitSet&#xff09;、向量&#xff08;Vector&a…

进阶C语言:程序环境和预处理

有关C语言的知识马上就要结束了&#xff0c;在学完了前面的基础之上我们就来深究一下程序底层的逻辑&#xff0c;关于程序的预处理编译指令&#xff0c;话不多说&#xff0c;我们直接开始&#xff1a; 目录 1.程序的翻译环境和执行环境 2. 详解编译链接 2.1翻译环境 2.2编译…

IT培训有靠谱的机构吗,长什么样的?

关于IT培训的问题&#xff0c;网上有一大波劝退的声音&#xff1a;现在的IT越来越卷&#xff0c;高校计算机专业毕业生每年那么多&#xff0c;作为小白转行的你竞争力又在哪里呢&#xff1f;而且去年互联网大厂那么多裁员&#xff0c;还有大幅度降薪等等&#xff0c;IT行业已经…