首页 > 其他分享 >synchronized介绍

synchronized介绍

时间:2024-08-03 21:27:19浏览次数:11  
标签:同步 synchronized 对象 介绍 markword 线程 轻量级 偏向

synchronized

原理:

从JVM规范中可以看到Synchonized在JVM里的实现原理,JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter 和monitorexit指令实现的,而方法同步是使用另外一种方式实现的,通过编译之后,同步方法与普通方法不同是被加入了一个acc_synchronized标识,然后jvm通过识别这个标识来确定这是一个同步方法。但是,方法的同步同样可以使用这两个指令来实现。 monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到结束位置和异常处,JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象都有一个monitor与之关联,线程执行到monitorenter 指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。

优化

在早期的时候,sync他是重量级的锁,就是操作系统层面的锁,需要从用户态切换到内核态。这是非常耗时的操作,性能低。

在java6之后,引入了一系列的优化,锁升级。随着的竞争加剧,锁会一步步升级。从低到高是:无锁,偏向锁,轻量级锁,重量级锁,并且是不可降级的。

对象的内存分布:

0 - 4 markword

4 - 8 markword

markword存储锁信息,gc信息

8 - 12 指向.class

以上统称为对象头。

后面是成员变量占的位置,不足8的整数倍,需要补字节到8的整数倍

在这里插入图片描述

重量级锁中指向互斥量的指针实际是指向monitor对象。

锁升级:

由低到高:无锁状态、偏向锁状态、轻量级锁状态(自旋锁)和重量级锁状态
在这里插入图片描述

偏向锁,轻量级锁,都是在用户态的。

用户态–》内核态 : 操作系统执行终端0x80

轻量级锁-------重量级锁:

jdk1.6之前:可以设置升级的线程自旋的次数阈值或者自旋的线程数阈值

jdk1.6之后:自适应,别设置了。

jvm启动时候的,有一段时间是不会启动偏向锁的,因为偏向锁适合的无线程竞争的情况,在明确知道会有多线程竞争的情况的时候,请直接使用轻量级锁,此时轻量级锁的效率可能更高,因为开始就启动偏向锁,还是会升级为轻量级锁,但是中间有一个偏向锁撤销的过程,浪费cpu资源。jvm启动必定是存在多线程竞争,所以jvm会延迟开启偏向锁。默认4s,也可以通过参数设置(-xx: BiasedLockingStartDelay== yourValue (unit:ms)

禁用偏向锁:xx - UseBiasedLocking

匿名偏向:

markword中的线程指针没有指向任何线程:匿名偏向。

如果synchronized(对象),对象中的markword中的偏向锁指针指向当前线程数,这个时候就不是匿名偏向锁了。

自旋锁

​ 共享变量。

自旋锁缺点:

在这里插入图片描述

锁重入

一个方法可能被多个方法调用,而这个多个方法的同步逻辑不一样。

标签:同步,synchronized,对象,介绍,markword,线程,轻量级,偏向
From: https://blog.csdn.net/ZHOUJC5417/article/details/140893779

相关文章

  • 一文讲清楚synchronized原理---每周一更系列
    synchronized是Java提供的原子性内置锁,这种内置的并且使用者看不到的锁也被称为监视器锁。synchronized通过在代码块前后加上monitorenter和monitorexit字节码指令用于实现进入和退出。如果是同步方法,则是打上标记,隐式的使用monitorenter和monitorexit字节码指令。在jdk1.5之前......
  • Unittest框架的介绍及使用
    介绍基本概念​ unittest是Python自带的一个单元测试框架,它可以做单元测试,也能用于编写和运行重复的测试工作。它给自动化测试用例开发和执行提供了丰富的断言方法,判断测试用例是否通过,并最终生成测试结果.四大组件testcase:就是我们的测试用例,unittest中提供了一个......
  • 服务器性能分析软件「 WGCLOUD 」完整功能介绍
    WGCLOUD是一款国产开源的服务器状态性能监测软件,免费高效,轻量实用,部署简单,上手操作容易,颜值在线,更好的是它具有极低的资源占用WGCLOUD官网下载地址:www.wgstart.comWGCLOUD可以支持哪些操作平台,如下:Linux:Debian,RedHat,CentOS,Ubuntu,Fedora,SUSE,麒麟,统信(UOS),龙芯(mips)等Windows:W......
  • LLM场景下常用浮点数介绍
    在计算机中,浮点数的表示基于IEEE754标准,这是最广泛使用的浮点数表示标准。对于一个具体的数值,如10.2345434,它会被分解为符号位、指数位和尾数位。这里以最常见的float32(单精度浮点数)为例来解释这个过程:符号位如果数值是正的,符号位为0;如果数值是负的,符号位为1。对于10.23454......
  • LLM场景下常用浮点数介绍
    在计算机中,浮点数的表示基于IEEE754标准,这是最广泛使用的浮点数表示标准。对于一个具体的数值,如10.2345434,它会被分解为符号位、指数位和尾数位。这里以最常见的float32(单精度浮点数)为例来解释这个过程:符号位如果数值是正的,符号位为0;如果数值是负的,符号位为1。对于10.23454......
  • LLM场景下常用浮点数介绍
    在计算机中,浮点数的表示基于IEEE754标准,这是最广泛使用的浮点数表示标准。对于一个具体的数值,如10.2345434,它会被分解为符号位、指数位和尾数位。这里以最常见的float32(单精度浮点数)为例来解释这个过程:符号位如果数值是正的,符号位为0;如果数值是负的,符号位为1。对于10.23454......
  • LLM场景下常用浮点数介绍
    在计算机中,浮点数的表示基于IEEE754标准,这是最广泛使用的浮点数表示标准。对于一个具体的数值,如10.2345434,它会被分解为符号位、指数位和尾数位。这里以最常见的float32(单精度浮点数)为例来解释这个过程:符号位如果数值是正的,符号位为0;如果数值是负的,符号位为1。对于10.23454......
  • LLM场景下常用浮点数介绍
    在计算机中,浮点数的表示基于IEEE754标准,这是最广泛使用的浮点数表示标准。对于一个具体的数值,如10.2345434,它会被分解为符号位、指数位和尾数位。这里以最常见的float32(单精度浮点数)为例来解释这个过程:符号位如果数值是正的,符号位为0;如果数值是负的,符号位为1。对于10.23454......
  • 5、主板品牌分类介绍:微星 - 计算机硬件品牌系列文章
    微星科技(‌MSI)‌是一家全球知名的IT配件公司,‌专注于主板、‌显卡等产品的研发、‌生产和销售。‌微星科技成立于1986年8月,‌总部位于台湾新北市中和区。‌由徐祥、‌黄金请、‌林文通、‌游贤能、‌卢琪隆五位曾任职于台湾新力公司的工程师共同创办。‌自创立以来,‌微星......
  • (11-1)基于SLAM的自主路径导航系统:背景介绍+项目介绍
    在本章的内容中,通过具体实例展示了实现一个自主路径导航系统的过程。本项目利用TurtleBot3机器人和ROS框架实现了自主路径规划功能,通过SLAM技术进行实时地图建立和定位,并结合move_base包实现路径规划。用户可以根据需求选择不同的SLAM方法,包括gmapping、cartographer、hector......